Как проверить тип прокси?

Для проверки типа прокси в языке программирования Go можно воспользоваться стандартными библиотеками net/http и net/url.

Вот пример кода, который позволяет проверить тип прокси:

package main

import (
	"fmt"
	"net"
	"net/http"
	"net/url"
	"time"
)

func main() {
	proxyURL, err := url.Parse("http://proxy.example.com:8080")
	if err != nil {
		fmt.Println("Ошибка при разборе URL прокси:", err)
		return
	}

	transport := &http.Transport{
		Proxy: http.ProxyURL(proxyURL),
		DialContext: (&net.Dialer{
			Timeout:   30 * time.Second,
			KeepAlive: 30 * time.Second,
		}).DialContext,
		MaxIdleConns:          100,
		IdleConnTimeout:       90 * time.Second,
		TLSHandshakeTimeout:   10 * time.Second,
		ExpectContinueTimeout: 1 * time.Second,
	}

	client := &http.Client{
		Transport: transport,
		Timeout:   30 * time.Second,
	}

	resp, err := client.Get("https://www.example.com")
	if err != nil {
		fmt.Println("Ошибка при отправке HTTP-запроса:", err)
		return
	}
	defer resp.Body.Close()

	if resp.StatusCode == http.StatusOK {
		fmt.Println("Прокси типа HTTP")
	} else if resp.StatusCode == http.StatusGatewayTimeout {
		fmt.Println("Прокси типа SOCKS")
	} else {
		fmt.Println("Не удалось определить тип прокси")
	}
}

В этом примере мы используем функцию url.Parse для разбора URL прокси. Затем мы создаем объект http.Transport и передаем разобранный URL прокси в качестве параметра Proxy. Затем мы создаем клиент http.Client с указанным транспортом.

Затем мы совершаем HTTP-запрос с помощью метода client.Get на какой-либо адрес (в данном случае https://www.example.com). Полученный ответ проверяем на статус код: если код равен http.StatusOK, то это значит, что прокси имеет тип HTTP. Если код равен http.StatusGatewayTimeout, то значит, что прокси имеет тип SOCKS. В противном случае, не удалось определить тип прокси.

Этот пример позволяет определить тип прокси на основе ответа от сервера. Однако, следует иметь в виду, что этот метод не всегда может быть точен и надежен, так как некоторые прокси-серверы могут быть настроены таким образом, чтобы не передавать информацию об их типе. В таких случаях можно использовать другие методы, например, анализировать информацию в заголовках ответа или проводить дополнительные тесты.