It seems that if you use a file reader as the reader of the request (even if you wrap it into another object), golang's request to S3 will always end with a 501 Not Implemented error response. If you load the same file in memory (e.g. a buffer) this doesn't happen and it works.
go run main.go buffer ./test-file <some presigned string>
works