Переход по адресу в Go
Сервер может ответить не телом страницы, а
указанием другого адреса. Такие ответы помечают
кодами триста один и триста два. Стандартный
клиент в пакете net/http по умолчанию
сам повторяет запрос по новому адресу, пока
цепочка не закончится или не сработает лимит.
В учебных задачах иногда нужно увидеть именно первый ответ с переходом, а не финальную страницу. Для этого у клиента задают функцию проверки перехода: если она возвращает особую ошибку, клиент останавливается и оставляет исходный код состояния в объекте ответа.
Остановим автоматический переход:
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
client := &http.Client{
CheckRedirect: func(
req *http.Request,
via []*http.Request,
) error {
return http.ErrUseLastResponse
},
}
resp, err := client.Get("https://example.com")
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
fmt.Println(resp.StatusCode)
}
На учебном хосте часто приходит код триста два с заголовком нового адреса. Без остановки клиент дошел бы до конечной страницы и показал бы код двести.
Тот же клиент можно передать в выполнение собранного запроса:
package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
client := &http.Client{
CheckRedirect: func(
req *http.Request,
via []*http.Request,
) error {
return http.ErrUseLastResponse
},
}
req, err := http.NewRequest(
"GET",
"http://127.0.0.1:8080/old",
nil,
)
if err != nil {
log.Fatal(err)
}
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
fmt.Println(resp.StatusCode)
loc := resp.Header.Get("Location")
fmt.Println(loc)
_, err = io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
}
Дан адрес "https://example.com":
https://example.com
Создайте клиент с остановкой перехода, выполните запрос и выведите код состояния первого ответа.
Скажите, какой код состояния вы увидите у клиента по умолчанию для того же адреса и почему он отличается.
Дан следующий код:
resp, err := http.Get("https://example.com")
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
Скажите, сколько раз по сети уйдет запрос при типичном переходе с учебного хоста, если переход не отключали.