The bucket creation use return code 400 (Bad request) if the bucket already exists, which seems wrong to me. From the description of 400 I can read:
400 - The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repeat the request without modifications.
Better alternatives would be:
403 - The server understood the request, but is refusing to fulfill it. Authorization will not help and the request SHOULD NOT be repeated. If the request method was not HEAD and the server wishes to make public why the request has not been fulfilled, it SHOULD describe the reason for the refusal in the entity. If the server does not wish to make this information available to the client, the status code 404 (Not Found) can be used instead.
409 - conflict
412 - The precondition given in one or more of the request-header fields evaluated to false when it was tested on the server. This response code allows the client to place preconditions on the current resource metainformation (header field data) and thus prevent the requested method from being applied to a resource other than the one intended.