### 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_
"""
        When sending a Pu request to S3 with a very raw request not having any indication that the request is
        directed to S3 (no signing, no specific S3 endpoint) and encoded as a form, the request will go through the
        ServiceNameParser handler.
        This parser will try to parse the form data (which in our case is binary data), and will fail with a decoding
        error. It also consumes the stream, and leaves S3 with no data to save.
        This test verifies that this scenario works by skipping the service name thanks to the early S3 CORS handler.
        """
        default_endpoint = f"http://{get_localstack_host().host_and_port()}"
        _key = "test-routing-key"
        key_url = f"{default_endpoint}/{s3_bucket}/{_key}"
        data = os.urandom(445529)
        resp = .put(
            key_url, data=data, headers={"Content-Type": "application/x-www-form-urlencoded"}
        )
        assert resp.ok
        get_ = aws_client.s3.get_(Bucket=s3_bucket, Key=_key)
        assert get_["Body"].read() == data
        fake_key_url = f"{default_endpoint}/fake-bucket-{short_uid()}/{_key}"
        resp = .put(
            fake_key_url, data=data, headers={"Content-Type": "application/x-www-form-urlencoded"}
        )
        assert b"NoSuchBucket" in resp.content
class TestS3MultiAccounts:
    @pytest.fixture
    def primary_client(self, aws_client):