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
go run main.go reader ./test-file <some presigned string>
invalid response code: 501 Not Implemented
<Error><Code>NotImplemented</Code><Message>A header you provided implies functionality that is not implemented</Message><Header>Transfer-Encoding</Header><RequestId>F2D54740EA621AA8</RequestId><HostId>uVkv+diBWzEO9xaCIXTj45mm5b6HhIkrcwmBSJxIoJ1XzJeOv+fbEphs58JK9PkTIriENefs41w=</HostId></Error>