### 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_
headers: dict[str, str], path: str
) -> tuple[Optional[str], Optional[str]]:
    """
    Extract the bucket name and the object key from a request headers and path. This works with both virtual host
    and path style requests.
    :param headers: the request headers, used to get the Host
    :param path: the request path
    :return: if found, the bucket name and object key
    """
    bucket_name = None
    object_key = None
    host = headers.get("host", "")
    if ".s3" in host:
        vhost_match = _s3_virtual_host_regex.match(host)
        if vhost_match and vhost_match.group("bucket"):
            bucket_name = vhost_match.group("bucket") or None
            split = path.split("/", maxsplit=1)
            if len(split) > 1 and split[1]:
                object_key = split[1]
    else:
        path_without_params = path.partition("?")[0]
        split = path_without_params.split("/", maxsplit=2)
        bucket_name = split[1] or None
        if len(split) > 2:
            object_key = split[2]
    return bucket_name, object_key
def normalize_bucket_name(bucket_name):