So it looks I found a clue.
Investigating the source code of HttpRequest in google-http-client library, I noticed a small details that made a huge difference. There is this comment
* Some servers will fail to process a POST/PUT/PATCH unless Content-Length header >= 1. If this
* value is set to {@code false} then " " is set as the content with Content-Length {@code 1} for
* empty contents. Defaults to {@code true}.
Wow. To make my PUT bucket request work, I had to write in the request an empty space, with of course Content-Length: 1
And finally, 200 OK.
I suggest the GCS team to put this in evidence in the documentation.
And while I'm here, I would also suggest to take a look at the status codes for responses that have no content. Some endpoints returns a 204 No Content, while others 200 OK but still no content. Consistency would be much appreciated on the developer side.
Thanks, bye!