Как разобрать 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 соединение и просто прочитайте все, что осталось на сокете.

Другие вопросы по тегам