The form POST operation to S3 accepts a `success_action_status` field which can be set to 200/201/204, see [here](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html). Localstack currently handles the `success_action_redirect` field [here](https://github.com/localstack/localstack/blob/master/localstack/services/s3/s3_listener.py#L518) and so we should look into handling the `success_action_status` field too.

The 201 from AWS responds with an XML document with some fields about the object that has just been created in AWS, see below.

```
<PostResponse>
    <Location>https://s3.amazonaws.com/link-to-the-file</Location>
    <Bucket>s3-bucket</Bucket>
    <Key>development/8614bd40-691b-4668-9241-3b342c6cf429/image.jpg</Key>
    <ETag>"32-bit-tag"</ETag>
</PostResponse>
```
's3.us-west-2.amazonaws.com']
        
        bucket_path = '/{}/{}'.format(bucket_name, s3_key)
        for host in hosts:
            headers = CaseInsensitiveDict({'Host': hosts[0]})
            returned_bucket_name = s3_listener.get_bucket_name(bucket_path, headers)
            self.assertEqual(returned_bucket_name, bucket_name, 'Should match when bucket_name is in path')
        
        for host in hosts:
            headers = CaseInsensitiveDict({'Host': '{}.{}'.format(bucket_name, host)})
            returned_bucket_name = s3_listener.get_bucket_name(s3_key, headers)
            self.assertEqual(returned_bucket_name, bucket_name, 'Should match when bucket_name is in the host')
    def test_event_type_matching(self):
        match = s3_listener.event_type_matches
        self.assertTrue(match(['s3:ObjectCreated:*'], 'ObjectCreated', 'Put'))
        self.assertTrue(match(['s3:ObjectCreated:*'], 'ObjectCreated', 'Post'))
        self.assertTrue(match(['s3:ObjectCreated:Post'], 'ObjectCreated', 'Post'))
        self.assertTrue(match(['s3:ObjectDeleted:*'], 'ObjectDeleted', 'Delete'))
        self.assertFalse(match(['s3:ObjectCreated:Post'], 'ObjectCreated', 'Put'))
        self.assertFalse(match(['s3:ObjectCreated:Post'], 'ObjectDeleted', 'Put'))
    def test_is_query_allowable(self):
        self.assertTrue(s3_listener.ProxyListenerS3.is_query_allowable('POST', 'uploadId'))
        self.assertTrue(s3_listener.ProxyListenerS3.is_query_allowable('POST', ''))
        self.assertTrue(s3_listener.ProxyListenerS3.is_query_allowable('PUT', ''))
        self.assertFalse(s3_listener.ProxyListenerS3.is_query_allowable('POST', 'differentQueryString'))
        
        self.assertFalse(s3_listener.ProxyListenerS3.is_query_allowable('DELETE', 'uploadId'))
        self.assertFalse(s3_listener.ProxyListenerS3.is_query_allowable('DELETE', 'differentQueryString'))
        self.assertFalse(s3_listener.ProxyListenerS3.is_query_allowable('PUT', 'uploadId'))
    def test_append_last_modified_headers(self):