Получение ответа об ошибке EOF при выполнении запроса HEAD

avatar
Rajesh Sethi
8 августа 2021 в 23:05
426
1
1

Я пытаюсь выполнить запрос HEAD по адресу "https://speed.hetzner.de/100MB.bin", чтобы получить метаданные файла. Я получил ответ об ошибке EOF. Однако запрос GET выполнен успешно для того же URL-адреса.

Какие могут быть возможные причины?

Я подозреваю, что сервер заблокировал запросы HEAD, но как мне это проверить?

PS: добавление кода:

func BuildRequest(method string, url string) (*http.Request, error) {
    r, err := http.NewRequest(method, url, nil)
    r.Header.Set("User-Agent", "my app")
    return r, err
}

func (m *FileMeta) Fetch(url string) error {
    r, err := BuildRequest(http.MethodHead, url)
    if err != nil {
        return err
    }

    resp, err := HTTPClient().Do(r)

    if err != nil {
        return err
    }

    defer resp.Body.Close()
}

Снимок экрана с ошибкой: enter image description here

Источник
paulsm4
10 августа 2021 в 16:47
0

Вопрос: вы подтвердили, что можете получить действительный ответ HEAD независимо от Go (вы пробовали curl, Postman или аналогичный? Они ответили с информацией HEADER?) Вопрос: Вы нашли жизнеспособное решение кода «Go» (например, http.Head())? Пожалуйста, дайте нам знать!

Rajesh Sethi
10 августа 2021 в 20:30
0

Я пытался с Postman, он не ответил с информацией HEADER. Пробовал Curl, пишет "Пустой ответ с сервера".

Rajesh Sethi
10 августа 2021 в 20:37
0

``` resp, err := http.Head("speed.hetzner.de/100MB.bin") if err != nil {return err} ``` попробовал приведенный выше код, как вы предложили. он выдает ту же ошибку "EOF".

paulsm4
10 августа 2021 в 21:20
0

Круто - спасибо. Итак, похоже, что ваше исходное предположение верно: 1) Ваш код в порядке: вы не «делаете ничего неправильного» (например, пытаетесь прочитать «Тело», которого там нет). 2) Скорее, этот конкретный URL-адрес (speed.hetzner.de) блокирует (или, по крайней мере, отказывается обрабатывать) запросы HEAD.

Ответы (1)

avatar
paulsm4
8 августа 2021 в 23:16
2

Вы не показали нам код...

... но похоже, что вы пытаетесь прочитать "ответ" HTTP на запрос HEAD (вместо доступа только к заголовкам ответа HTTP).

Согласно RFC:

https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.4

Метод HEAD идентичен GET, за исключением того, что сервер НЕ ДОЛЖЕН вернуть тело сообщения в ответ. Метаинформация содержала в заголовках HTTP в ответ на запрос HEAD ДОЛЖЕН быть идентичным к информации, отправленной в ответ на запрос GET. Этот метод может использоваться для получения метаинформации об объекте, подразумеваемом запрос без передачи самого тела сущности. Этот метод часто используется для проверки гипертекстовых ссылок на достоверность, доступность, и недавняя модификация.

Другими словами, ответ на запрос HEAD не имеет тела. Если вы попытаетесь прочитать его, вы получите EOF. Я подозреваю, что здесь происходит именно это.


Спасибо, что обновили свой вопрос с помощью этого кода. Похоже, вы используете Go.

Попробуйте это:

res, err := http.Head("https://golang.org")
if err != nil {
    panic(err)
}
println(res.StatusCode)

И помните: у res не будет тела.


ДОБАВЛЕНИЕ

– Раджеш Сетхи

Я пытался использовать Postman, но он не ответил с информацией HEADER. Пробовал Curl, пишет "Пустой ответ с сервера".

Приведенный выше код resp, err := http.Head("speed.hetzner.de/100MB.bin") выдает ту же ошибку "EOF".

– paulsm4

Круто, спасибо. Итак, похоже, ваше исходное предположение верно:

  1. Ваш код в порядке: вы не "делаете ничего неправильного" (например, пытаетесь прочитать "тело", которого там нет).

  2. Скорее, этот конкретный URL (speed.hetzner.de) блокирует (или, по крайней мере, отказывается обрабатывать) запросы HEAD.

Rajesh Sethi
9 августа 2021 в 09:05
0

он терпит неудачу в HTTPClient().Do(r) и возвращает ошибку

paulsm4
9 августа 2021 в 15:12
1

Тааааак.... вы пытаетесь сделать запрос HEAD от Go. ПРЕДЛОЖЕНИЯ: 1) Попробуйте "HEAD", используя другой метод, например. curl или Почтальон. Убедитесь, что «работает». 2) Далее попробуйте этот пример, используя http.Head()): coderhelper.com/a/38563299/421195, 3) Если вы указываете метод, обязательно используйте константу Go HEAD