I am using an http client to get a json body, and read it to a byte array like
client := new(http.Client)
client.Timeout = time.Second * 10
GetJobJson, err := client.Get(joblocation.String()) //where joblocation is of type *url.Url
if err != nil {
errorlog.Err.Println("Error getting job from", joblocation.String(), err)
return false, http.StatusBadRequest, nil
}
buff := make([]byte, GetJobJson.ContentLength)
length, err := GetJobJson.Body.Read(buff) //This returns an EOF error
if err != nil {
errorlog.Err.Println("Error reading request body of length", length, "vs contentlength", GetJobJson.ContentLength, err)
return false, http.StatusBadRequest, nil
}
In the above code, GetJobJson.Body
is of type io.ReadCloser
, which implements Reader
, having Read
method, which I am using here as
length, err := GetJobJson.Body.Read(buff)
But since I am handling error here, it is returning an error which says EOF.
The http endpoint to where I am sending the request is running an apache server, mentioning it here since I am not sure if it matters.
If I am not handling the error, I get the complete json body, which is there in the remote server, and the program continues to work as expected.
What is the best way to handle this? Is the Read
method that I use, is bad for this situation? Please advise.
Thank you.
Handing io.EOF
is part of the contract of using an io.Reader
, and it indicates that there's nothing more to read. If you have read what you expected to read, there is no error. If you look at functions like ioutil.ReadAll
, you'll see that it handles the EOF, and returns no error at the end of the stream.
You may also consider not checking for ContentLength, as it precludes you from handing chunked responses.