2

I have an error when deploying my golang API on Heroku. Heroku detects a disconnect and report a 500 error, while in the logs my server correctly answer with a 200. It is multipart/form-data request with a file attached, and I simply return a JSON in the response body.

2019-03-01T07:35:29.060814+00:00 app[web.1]: xx.x.xx.x - - [01/Mar/2019:07:35:29 +0000] "POST /v1/fixture/extract/ HTTP/1.1" 200 2133
2019-03-01T07:35:29.413179+00:00 heroku[router]: sock=backend at=error code=H18 desc="Server Request Interrupted" method=POST path="/v1/fixture/extract/" host=xxx.com request_id=28cdf569-2e00-47b8-9989-9280865707c8 fwd="xx.x.xx.x" dyno=web.1 connect=1ms service=352ms status=503 bytes=2280 protocol=https

Here is the curl when I hit the service locally without reverse proxy:

*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> POST /v1/fixture/extract/ HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.64.0
> accept: application/json
> Content-Length: 154090
> Content-Type: multipart/form-data; boundary=------------------------7a9bb5de3838f429
> Expect: 100-continue
> 
< HTTP/1.1 200 OK
< Content-Type: application/json
< Date: Fri, 01 Mar 2019 07:44:50 GMT
< Connection: close
< Transfer-Encoding: chunked
< 

I struggle to find the reason why this would happen.

My go function:

func FixtureExtract(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")

    json.NewEncoder(w).Encode(ExtractFixture{})
}
Jonathan Muller
  • 7,348
  • 2
  • 23
  • 31

1 Answers1

1

The cause of the error was that I was not consuming the multipart/form-data send by the client before returning an answer.

This fixed the issue:

func FixtureExtract(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")

    r.ParseMultipartForm(32 << 20)

    json.NewEncoder(w).Encode(ExtractFixture{})
}

I just had to parse the form with r.ParseMultipartForm(32 << 20).

Jonathan Muller
  • 7,348
  • 2
  • 23
  • 31
  • 2
    I contacted Heroku support about this, and it is actually a bug in the Heroku router. Your server is not doing anything wrong with respect to the HTTP spec. I described this in more detail [here](https://stackoverflow.com/a/63057984/1018290). – Will Sewell Jul 23 '20 at 15:41