# cURL через прокси: все важные параметры с примерами

cURL — самый быстрый способ проверить работу прокси и эталон, которому следуют остальные библиотеки. Освойте пять параметров прокси, и вы сможете диагностировать любой клиент.


## Команда в одну строку

```bash
curl -x http://USER-cc-us:PASS@res.hodlproxy.com:9000 https://api.ipify.org
```

`-x` (или `--proxy`) принимает URL прокси со встроенными учётными данными. cURL автоматически создаёт туннель CONNECT к целям HTTPS и поручает прокси разрешить имя хоста.


## Полезные параметры

| Параметр | Назначение |
| --- | --- |
| -x, --proxy URL | Прокси: схема, хост, порт и необязательные учётные данные |
| -U, --proxy-user user:pass | Учётные данные отдельно — удобно, если пароль содержит специальные символы |
| --proxy-basic | Принудительная базовая аутентификация прокси (используется по умолчанию, если указан пароль) |
| -v | Показать обмен CONNECT, коды состояния прокси и заголовки ответа |
| --noproxy '*' | Игнорировать переменные окружения прокси для этого вызова |
| -w '%{time_total}\n' | Вывести время выполнения для сравнения выходных узлов |


## SOCKS5 и удалённое разрешение DNS

```bash
# Имя хоста разрешается на выходном узле (рекомендуется)
curl -x socks5h://USER-cc-de:PASS@res.hodlproxy.com:9001 https://api.ipify.org

# Имя хоста разрешается локально, затем IP-адрес передаётся прокси (раскрывает DNS-запрос)
curl -x socks5://USER-cc-de:PASS@res.hodlproxy.com:9001 https://api.ipify.org
```


## Переменные окружения

Инструменты, которые вызывают cURL через оболочку, и многие другие программы учитывают `http_proxy`, `https_proxy` и `no_proxy`. Экспортируйте их один раз на весь рабочий сеанс.

```bash
export https_proxy="http://USER-cc-us:PASS@res.hodlproxy.com:9000"
export http_proxy="$https_proxy"
export no_proxy="localhost,127.0.0.1"
curl https://api.ipify.org   # направляется через прокси без -x
```


## Разбор ошибки

```bash
curl -v -x http://USER:WRONG@res.hodlproxy.com:9000 https://api.ipify.org 2>&1 | grep -E "CONNECT|HTTP/1.1 4|HTTP/1.1 5"
# < HTTP/1.1 407 Proxy Authentication Required  -> учётные данные
# < HTTP/1.1 400 Bad Request                    -> неверный параметр имени пользователя
# < HTTP/1.1 502 Bad Gateway                    -> нет выходного узла для этого местоположения; расширьте географию поиска
```

Код состояния в строке CONNECT поступает от шлюза, а код после `Connection established` — от целевого сайта. На [странице ошибок](https://hodlproxy.com/ru/docs/errors) объяснён каждый код шлюза.


## Ротация сессий в цикле

```bash
for i in $(seq 1 5); do
  curl -s -x "http://USER-cc-us-sid-run$i-ttl-5m:PASS@res.hodlproxy.com:9000" https://api.ipify.org
  echo
done   # пять разных выходных узлов в США, каждый можно повторно использовать пять минут по его идентификатору
```


## Вопросы

**Нужен ли cURL специальный параметр для HTTPS через прокси?**

Нет. При URL прокси с http:// cURL автоматически отправляет CONNECT для целей https://; параметр --proxytunnel нужен только для принудительного туннелирования обычного HTTP.

**Мой пароль содержит @ или :, и cURL выдаёт ошибку.**

Передайте учётные данные через -U user:pass вместо их включения в URL или закодируйте специальные символы в формате URL.

Источник: https://hodlproxy.com/ru/guides/curl-proxy-options
