### Is there an existing issue for this?

- [X] I have searched the existing issues

### Current Behavior

- Localstack fails with HTTP 500, error code "InternalError", message "not enough values to unpack (expected 2, got 1)" when `CopySource` is an invalid string for `copy_object` API.

### Expected Behavior

- For the same API `copy_object`, the cloud fails with HTTP 400, error code "InvalidArgument".
- Localstack should handle invalid `CopySource` i.e., it is a dictionary with one value or an invalid string not adhering to "{bucket}/{key}" format.

### How are you starting LocalStack?

With a `docker run` command

### Steps To Reproduce

#### How are you starting localstack (e.g., `bin/localstack` command, arguments, or `docker-compose.yml`)

    docker run localstack/localstack

#### Client commands (e.g., AWS SDK code snippet, or sequence of "awslocal" commands)

    botoclient.copy_object(CopySource="Invalid_random_string", Bucket="test_bucket", Key=key) 


 test_bucket is a valid bucket.  

### Environment

```markdown
- OS: Ubuntu 22.04.2 LTS
- LocalStack: 2.1.0
- boto3: 1.28.6
```


### Anything else?

_No response_
import base64
import codecs
import datetime
import hashlib
import logging
import re
import zlib
from typing import IO, Any, Dict, Literal, NamedTuple, Optional, Protocol, Tuple, Type, Union
from urllib import parse as urlparser
import xmltodict
from botocore.exceptions import ClientError
from botocore.utils import InvalidArnException
from zoneinfo import ZoneInfo
from localstack import config, constants
from localstack.aws.api import CommonServiceException, RequestContext
from localstack.aws.api.s3 import (
    AccessControlPolicy,
    BucketCannedACL,
    BucketName,
    ChecksumAlgorithm,
    CopyObjectRequest,
    CopySource,
    ETag,