Golang http request results in EOF errors when making multiple requests successively
go
Solution
I'm going to guess there is no problem with your code. The most likely cause of your problem is because the server is closing the connection. Rate limiting is one possible reason for this.
Your test shouldn't be relying on an external service that's very brittle and not hermetic. Instead you should think about spinning up a test server locally.
Problem
I am trying to debug a very unusual error I am receiving for a simple REST library I wrote. I am using the standard net/http package to make Get, Post, Put, Delete requests but my tests occasionally fail when I make multiple requests successively. My test looks like this: ``` func TestGetObject(t *testing.T) { firebaseRoot := New(firebase_url) body, err := firebaseRoot.Get("1") if err != nil { t.Errorf("Error: %s", err) } t.Logf("%q", body) } func TestPushObject(t *testing.T) { firebaseRoot := New(firebase_url) msg := Message{"testing", "1..2..3"} body, err := firebaseRoot.Push("/", msg) if err != nil { t.Errorf("Error: %s", err) } t.Logf("%q", body) } ``` And I am making the request like this: ``` // Send HTTP Request, return data func (f *firebaseRoot) SendRequest(method string, path string, body io.Reader) ([]byte, error) { url := f.BuildURL(path) // create a request req, err := http.NewRequest(method, url, body) if err != nil { return nil, err } // send JSON to firebase resp, err := http.DefaultClient.Do(req) if err != nil { return nil, err } if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("Bad HTTP Response: %v", resp.Status) } defer resp.Body.Close() b, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, err } return b, nil } ``` Sometimes it works, but most of the time I get 1 or 2 failures: ``` --- FAIL: TestGetObject (0.00 seconds) firebase_test.go:53: Error: Get https://go-firebase-test.firebaseio.com/1.json: EOF firebase_test.go:55: "" --- FAIL: TestPushObject (0.00 seconds) firebase_test.go:63: Error: Post https://go-firebase-test.firebaseio.com/.json: EOF firebase_test.go:65: "" FAIL exit status 1 FAIL github.com/chourobin/go.firebase 3.422s ``` The failures happen when I make more than 1 request. If I comment out everything except for the PUT request, the tests consistently pass. Once I include a second test, such as GET, one or the other fails (sometimes both pass).