Проверьте ошибки http-прокси в Golang

У меня есть небольшой клиент 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-адрес прокси-сервера, ошибки аутентификации или прокси-сервер не запущен)

Спасибо!

Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете получить доступ к основной причине, используя функцию error.Unwrap.

conn, _, err := websocket.Dial(ctx, "ws://localhost:8080/ws", opts)
if err != nil {
    cause := errors.Unwrap(err)
    if cause != nil {
        err = cause
    }
}

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