Как разобрать http Получить тело запроса на Go http сервере?
На HTTP-сервере Go я могу получить тело запроса POST. Go net/http package, похоже, удаляет тело запроса GET. Я знаю, что лучше не использовать http GET с телом запроса, но мне нужно обработать http GET с телом запроса. Возможно ли это без изменения стандартной библиотеки? Пожалуйста, помогите, так как я не хочу переключаться на C с помощью libevent!
Когда клиент отправляет POST с телом запроса, приведенный ниже код покажет содержимое тела. Но когда клиент отправляет GET с телом запроса, в теле ничего нет.
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)
}
1 ответ
Большая часть магии происходит в transfer.go
, Вот что я нашел, что выглядит актуально в 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
}
Похоже, пока ваш клиент заканчивает Content-Length
заголовок, у тебя все хорошо. Если нет, библиотека предположит, что на GET
запрос.
Вы отошли от края карты, поскольку ваш клиент делает довольно необычные / неработающие вещи. Если вы можете исправить клиента, это ваш лучший выбор.
Тем не менее, если у вас есть клиент, которому вам нужна поддержка, который делает это неправильно, вам придется катать некоторые вещи самостоятельно. Вам не нужно идти до C и libevent. Просто скопируйте пакет net / http из стандартной библиотеки в ваш проект и измените его. Затем измените операторы импорта, чтобы они указывали на вашу версию библиотеки.
Кроме того, если вы знаете, что клиент не использует keep-alive, вы можете Hijack
соединение и просто прочитайте все, что осталось на сокете.