Reputation: 111
In a Go http server, I can get POST request body. Go net/http package seems to remove GET request body. I know it is better not to use http GET with request body,but I need to handle http GET with request body. Is it possible without changing the standard lib? Please help since I don't want to switch back to C with libevent!
When a client sends a POST with request body, below code will show the body content. But when a client sends a GET with request body, there is nothing in the body.
func handler(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
body, _ := ioutil.ReadAll(r.Body)
log.Printf("body: %v", string(body))
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
Upvotes: 3
Views: 8990
Reputation: 106
Most of the magic happens in transfer.go
. Here's what I found that looks relevant in the fixLength
func:
if !isResponse && requestMethod == "GET" {
// RFC 2616 doesn't explicitly permit nor forbid an
// entity-body on a GET request so we permit one if
// declared, but we default to 0 here (not -1 below)
// if there's no mention of a body.
return 0, nil
}
Looks like, as long as your client is ending a Content-Length
header, you're all good. If not, the library will assume there's no body on a GET
request.
You're kind of off the edge of the map as your client is doing some pretty unusual/broken stuff. If you can fix the client, that's your best bet.
That said, if you have a client you need to support that's doing this wrong, you're going to have to roll some things yourself. You don't need to go all the way down to C and libevent. Simply copy the net/http package from the standard library into your project and modify it. Then change your import statements to point at your version of the library.
Alternatively, if you know that the client is not using keep-alive, you can Hijack
the connection and just read whatever's left on the socket.
Upvotes: 4