### Is there an existing issue for this?

- [X] I have searched the existing issues

### Current Behavior

The Complete Multipart Upload operation generates the **InternalError** error for non-existing uploads.

### Expected Behavior

The Complete Multipart Upload operation generates the **NoSuchUpload** error for non-existing uploads.

### How are you starting LocalStack?

With a `docker run` command

### Steps To Reproduce

    docker run -it --rm -p 4566:4566 localstack/localstack

    aws s3api create-bucket --bucket test --endpoint-url http://localhost:4566 --create-bucket-configuration LocationConstraint=us-west-2

    aws s3api complete-multipart-upload --bucket test --endpoint-url http://localhost:4566 --key test --upload-id test

### Environment

```markdown
- OS: Windows 11
- LocalStack: latest
```


### Anything else?

The Abort Multipart Upload operation works correctly in LocalStack.

The official documentation: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html
Amazon S3 throws the correct **NoSuchUpload** error for both Abort and Complete operations.
"""
        Moto tries to parse the TagSet and then iterate of it, not checking if it returned something
        Potential to be an easy upstream fix
        """
        try:
            tags: Dict[str, str] = fn(*args, **kwargs)
        except TypeError:
            tags = {}
        return tags
    @patch(moto_s3_responses.S3Response._cors_from_body)
    def _fix_parsing_cors_rules(fn, *args, **kwargs) -> List[Dict]:
        """
        Fix parsing of CORS Rules from moto, you can set empty origin in AWS. Replace None by an empty string
        """
        cors_rules = fn(*args, **kwargs)
        for rule in cors_rules:
            if rule["AllowedOrigin"] is None:
                rule["AllowedOrigin"] = ""
        return cors_rules
    @patch(moto_s3_responses.S3Response.is_delete_keys)
    def s3_response_is_delete_keys(fn, self):
        """
        Old provider had a fix for a ticket, concerning 'x-id' - there is no documentation on AWS about this, but it is probably still valid
        original comment: Temporary fix until moto supports x-id and DeleteObjects (#3931)
        """
        return get_safe(self.querystring, "$.x-id.0") == "DeleteObjects" or fn(self)
    @patch(moto_s3_responses.S3ResponseInstance.parse_bucket_name_from_url, pass_target=False)
    def parse_bucket_name_from_url(self, request, url):