У меня есть небольшой клиент WebSocket, который подключается к серверу через прокси-сервер.
proxyURL, err := url.Parse("http://10.207.80.10:8081")
if err != nil {
log.Fatal("Failed to parse proxy URL:", err)
}
httpTransport := &http.Transport{
Proxy: http.ProxyURL(proxyURL),
}
httpClient := &http.Client{
Transport: httpTransport,
}
opts := &websocket.DialOptions{
HTTPClient: httpClient,
}
ctx := context.Background()
conn, _, err := websocket.Dial(ctx, "ws://localhost:8080/ws", opts)
if err != nil {
log.Fatal("Failed to connect to WebSocket server: ", err)
}
Теперь мне нужно обнаружить ошибки, которые могут возникнуть из-за прокси.
например Когда прокси не работает, я получил это
Failed to connect to WebSocket server: failed to WebSocket dial: failed to send handshake request: Get "http://localhost:8080/ws": proxyconnect tcp: dial tcp 10.207.80.10:8081: connect: no route to host
Когда я использовал неправильный ProxyURL (и прокси работал), я получил это
Failed to connect to WebSocket server: failed to WebSocket dial: failed to send handshake request: Get "http://localhost:8080/ws": proxyconnect tcp: dial tcp 10.207.80.10:8081: connect: connection refused
У меня возникла ошибка авторизации прокси-сервера, когда я использую неправильные учетные данные
Failed to connect to WebSocket server: failed to WebSocket dial: failed to send handshake request: Get "http://localhost:8080/ws": Proxy Authentication Required
Я думал об использовании ниже:
if strings.Contains(err.Error(), "proxyconnect tcp") {
log.Println("Proxy connection error:", err)
return
}
но он не обрабатывает прокси-аутентификацию (и, возможно, некоторые другие ошибки, которые могут быть связаны с прокси-сервером).
Есть ли другой, более надежный способ проверить наличие различных ошибок прокси? (например, ошибки конфигурации, такие как неверный URL-адрес прокси-сервера, ошибки аутентификации или прокси-сервер не запущен)
Спасибо!
Вы можете получить доступ к основной причине, используя функцию error.Unwrap.
conn, _, err := websocket.Dial(ctx, "ws://localhost:8080/ws", opts)
if err != nil {
cause := errors.Unwrap(err)
if cause != nil {
err = cause
}
}