Фэндом


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

В документе используется понятие «пользователь», как человек, который занимается написанием исходных кодов, использующих libcurl. Обычно это вы сами или кто-то на похожей должности. Также используется понятие «программа» в качестве исходного кода, использующего libcurl для передачи данных.

Чтобы получить более подробную информацию обо всех использующихся здесь опциях и функциях, обратитесь к соответствующим страницам документации.

ПостроениеПравить

Существует несколько разных способов построения C-программ. В этой главе рассматривается процесс сборки в стиле UNIX. Даже если вы используете другую систему, вы получите общую информацию, которая также может применяться для вашей среды,

Компиляция программыПравить

Ваш компилятор должен знать, где находятся заголовочные файлы libcurl. Поэтому вы должны настроить компилятор на включение соответствующих каталогов. Для получения необходимой информации может использоваться утилита curl-config:

$ curl-config --cflags

Линковка программы с libcurlПравить

После копмиляции программы, вам необходимо сделать линковку полученных объектных файлов для получения исполняемого файла. Для этого необходимо выполнить линковку с libcurl и, возможно, с другими библиотеками, от которых зависит libcurl. В первую очередь это касается библиотеки OpenSSL, а также некоторых стандартных библиотек ОС. Чтобы выяснить, какие флаги необходимо использовать, снова пригодится утилита curl-config:

$ curl-config --libs

SSL или нетПравить

Библиотека libcurl может быть собрана и настрона по-разному. Одна из вещей, которая варьируется от различных библиотек и сборки является поддержка SSL на основе перечисления, такие как HTTPS и FTPS. Если поддерживается SSL библиотеки была обнаружена должным образом при построении время, Libcurl будет построен с поддержкой SSL. Чтобы выяснить, если установлен Libcurl была построена с SSL включена поддержка использовать "ротор-конфигурации" вроде этого:

$ curl-config --feature

И если SSL поддерживается, ключевое слово "SSL" будет записано в стандартный вывод, возможно, вместе с несколькими другими функциями, которые могли быть включены или выключены на различных libcurl.

См. также "Особенности Libcurl Обеспечивает" дальше.

Макросы autoconfПравить

Когда вы пишете скрипт конфигурации для обнаружения Libcurl и установки переменных, соответственно, мы предлагаем Стандартная макрос, который, вероятно, делает все, что нужно в этой области. См. docs/libcurl/libcurl.m4 файл - он включает в себя документы о том, как его использовать.

Кросс-платформенный кодПравить

Разработчики libcurl потратили много времени и усилий, чтобы сделать libcurl кросс-платформенным.

Вы можете работать с libcurl одинаково на всех платформах, есть только несколько незначительных отличий. Если вы просто убедитесь, что написать свой код портативные достаточно, вы можете очень хорошо создать себе очень портативный программы. Libcurl не должно остановить вас от этого.

Глобальная подготовкаПравить

Программа должна инициализировать некоторые из Libcurl функциональность во всем мире. Это означает, что это должно быть сделано только один раз, независимо от того, сколько раз вы собираетесь использовать библиотеку. Однажды за все время жизни вашей программы. Это делается с помощью вызова curl_global_init(), который принимает один параметр, рассказывающий libcurl что именно необходимо инициализировать. Использование CURL_GLOBAL_ALL сделает его инициализировать все известные внутренние суб модулей и может быть хорошим вариантом по умолчанию. В настоящее время два бита, которые указаны следующие:

CURL_GLOBAL_WIN32

которые только ничего не делает на машинах Windows. При использовании на компьютере Windows, это сделает Libcurl инициализации win32 вещи розетки. Без того, что инициализирован правильно, ваша программа не может использовать сокеты правильно. Вы должны сделать это только один раз для каждого приложения, поэтому, если ваша программа уже делает это или другой библиотеке в использовании это, вы не должны говорить Libcurl сделать это также.

CURL_GLOBAL_SSL

которые только ничего не делает на libcurls скомпилированы и собраны с поддержкой SSL. В этих системах, это сделает Libcurl инициализации SSL библиотеки должным образом для этого приложения. Это только нужно сделать один раз для каждого приложения, так что если ваша программа или другую библиотеку уже делает это, то этот бит не должно быть необходимости.

Libcurl имеет механизм защиты по умолчанию, которая обнаруживает, если curl_global_init() не был вызван к тому времени curl_easy_perform() называется и если это так, Libcurl работает сама функция с догадались битов. Пожалуйста, обратите внимание, что в зависимости исключительно на это не считается хорошим и не очень хорошим.

Если программа не использует Libcurl, он должен вызвать curl_global_cleanup(), которая является противоположностью инициализации вызова. Он будет делать обратную операции по очистке ресурсов curl_global_init() называют инициализирован.

На неоднократные звонки в curl_global_init() и curl_global_cleanup()следует избегать. Они должны быть вызван только по одному разу. Есть много различных способов создания программ на языке Си. В этой главе будут считать UNIX-стиле процесса сборки. Если вы используете другую систему сборки, вы можете прочитать это, чтобы получить общую информацию, которая может применяться для вашей среды, а также.

Особенности Libcurl ОбеспечиваетПравить

Она считается лучшей практики для определения Libcurl функции во время выполнения, а не при построении время (если это возможно конечно). Позвонив по телефону curl_version_info (3) и проверить детали возвращены структуры, ваша программа может понять, что именно в данный момент Libcurl опор.

Простой интерфейсПравить

libcurl впервые ввел так называемый простой интерфейс. Все функции относящиеся к простому интерфейсу имеют префикс "curl_easy".

Последние версии libcurl также предлагают Multi и Share интерфейсы. Подробнее об этих интерфейсах и о том, для чего они предназначены и как их использовать, подробно описано в отдельной главе ниже. Перед ознакомлением с ними, нужно понять основы работы библиотеки, так что начать ознакомление следует с простого интерфейса.

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

Получите легкий ручка с

easyhandle = curl_easy_init();

Она возвращает легко ручку. С помощью этого вы переходите к следующему шагу: Настройка предпочтительных действий. Ручка просто логика лицом к предстоящей передаче или серия передач.

Вы можете установить свойства и параметры для этого ручку использованием curl_easy_setopt (3) . Они контролируют, как последующая передача или передача не будет. Параметры остаются установлен в ручку, пока снова установлен на что-то другое. Увы, несколько запросов, используя тот же ручка будет использовать те же опции.

Многие из установленных параметров в Libcurl являются "струны", указатели на данные заканчивается нулевой байт. Когда вы устанавливаете строки с curl_easy_setopt (3) , Libcurl вносит свои копии, так что они не должны быть сохранены вокруг в ваше приложение после того, как установлено [4].

Один из самых основных свойств установить в ручки URL. Вы можете установить нужный URL для передачи с CURLOPT_URL в порядке, похожие на:

curl_easy_setopt (ручки, CURLOPT_URL, " http://domain.com/ ");

Предположим на время, что вы хотите получить данные, как адрес идентифицирует удаленный ресурс вы хотите получить здесь. Так как вы пишете своего рода приложение, которое нуждается в этой передаче, я предполагаю, что вы хотели бы получить данные, передаваемые с вами напрямую, а не просто получить его прошло на стандартный вывод. Таким образом, вы написать свою собственную функцию, которая соответствует этому прототипу:

size_t write_data (недействительными * буфер, размер size_t, size_t nmemb, недействительными * userp);

Вы говорите Libcurl передать все данные в этой функции выдачи функцию, подобную этой:

curl_easy_setopt (easyhandle, CURLOPT_WRITEFUNCTION, write_data);

Вы можете контролировать, какие данные вашей функции обратного вызова получает в четвертый аргумент, установив еще одно свойство:

curl_easy_setopt (easyhandle, CURLOPT_WRITEDATA, и internal_struct);

Используя это свойство, можно легко передать местным данных между приложением и функцию, которая получает вызывается Libcurl. Libcurl само по себе не будет касаться данных, которые проходят с CURLOPT_WRITEDATA.

Libcurl предлагает свой ​​стандартный внутренний обратного вызова, которая будет заботиться о данных, если вы не установите обратного вызова с CURLOPT_WRITEFUNCTION. Это будет просто выводить полученные данные на стандартный вывод. Вы можете иметь обратного вызова по умолчанию записать данные на другой дескриптор файла путем передачи 'FILE *' в файл, открытый для записи с возможностью CURLOPT_WRITEDATA.

Теперь нам нужно сделать шаг назад и глубоко вздохнула. Вот один из тех редких зависит от платформы nitpicks. Знаете ли вы его? На некоторых платформах [2], Libcurl не сможет работать с файлами открыла программу. Таким образом, если вы используете по умолчанию обратного вызова и передать в открытом файле с CURLOPT_WRITEDATA, это будет крах. Поэтому следует избегать этого, чтобы ваша программа выполняется нормально, практически везде.

(CURLOPT_WRITEDATA ранее был известен как CURLOPT_FILE. Оба названия еще работать и делать то же самое).

Если вы используете Libcurl как DLL Win32, вы должны использовать CURLOPT_WRITEFUNCTION если вы установите CURLOPT_WRITEDATA - или вы будете испытывать сбои.

Есть, конечно, еще много вариантов вы можете установить, и мы свяжемся с несколькими из них позже. Давайте вместо этого продолжают фактической передачи:

Успех = curl_easy_perform (easyhandle);

curl_easy_perform (3) будет подключаться к удаленному сайту, сделать необходимые команды и получать передачи. Всякий раз, когда он получает данные, он вызывает функцию обратного вызова мы установлено ранее. Эта функция может получить один байт в то время, или он может получить много килобайт сразу. Libcurl обеспечивает как можно больше, как можно чаще. Ваша функция обратного вызова должна возвращать количество байт, он "заботился". Если это не то же самое количество байт, которое было передано ему, Libcurl прервет операцию и вернуться с кодом ошибки.

Когда передача завершена, функция возвращает код возврата, который информирует вас, если он преуспел в своей миссии или нет. Если код возврата не достаточно для вас, вы можете использовать CURLOPT_ERRORBUFFER отметить Libcurl в буфер ваш, где она будет храниться человека читаемым сообщение об ошибке, а также.

Итак, если вы хотите передать другим файлом, ручка готова быть использована вновь. Имейте в виду, это даже предпочтительно, чтобы Вы повторно использовать существующую ручку, если вы собираетесь сделать еще один перевод. Libcurl будет пытаться повторно использовать предыдущие соединения.

Для некоторых протоколов, загрузка файлов может включать в себя сложный процесс входа в систему, установив режим передачи данных, изменение текущего каталога и, наконец, передача файлов данных. Libcurl берет на себя все, что осложнения для вас. Учитывая, просто URL в файле, Libcurl будет заботиться о всех деталей, необходимых для получения файла переехали из одной машины в другую.

Multi-Threading вопросыПравить

Первым основным правилом является то, что вы никогда не должны одновременно поделиться Libcurl ручкой (будь то легко или несколькими или любой другой) между несколькими потоками. Используйте только одну ручку в одном потоке в любое время. Вы можете передать ручки вокруг между потоками, но вы никогда не должны использовать одну ручку из более чем одного потока в любой момент времени.

Libcurl полностью потокобезопасными, за исключением двух вопросов: сигналы и SSL / TLS обработчики. Сигналы используются для тайм-аута имя разрешается (во время поиска DNS) - когда построен без С-ар поддержки, а не на Windows.

Если вы обращаетесь к HTTPS и FTPS URL-адресов в многопоточных образом, вы тогда, конечно, по основной SSL библиотеки многопоточных и те, библиотеки могут иметь свои собственные требования по этому вопросу. В принципе, вы должны предоставить одну или две функции, чтобы позволить ему нормально функционировать. Для всех деталей, увидеть это:

OpenSSL

http://www.openssl.org/docs/crypto/threads.html # ОПИСАНИЕ

GnuTLS

http://www.gnu.org/software/gnutls/manual/html_node/ Multi_002dthreaded-applications.html

NSS

утверждал, что поточно-уже ни с чем требуется.

PolarSSL

Необходимые действия неизвестны.

yassl

Необходимые действия неизвестны.

axTLS

Необходимые действия неизвестны.

При использовании нескольких потоков вы должны установить опцию CURLOPT_NOSIGNAL 1 для всех ручек. Все будет или может прекрасно работать исключением того, что время ожидания не были выполнены во время просмотра DNS - которые можно обойти путем создания Libcurl с-ар поддержки. С-аров это библиотека, которая обеспечивает асинхронный решает именем. На некоторых платформах, Libcurl просто не будет функционировать должным образом многопоточных если эта опция.

Кроме того, отметим, что CURLOPT_DNS_USE_GLOBAL_CACHE не является поточно-безопасными.

Когда он не работаетПравить

Там всегда будут моменты, когда передача не может по какой-либо причине. Вы могли установить неправильно Libcurl опции или поняли, что Libcurl вариант на самом деле, или удаленный сервер может вернуть нестандартные ответы, которые путают библиотека, которая затем смешивает вашу программу.

Там в одно золотое правило, когда эти вещи происходят: установите опцию CURLOPT_VERBOSE 1. Это будет вызывать библиотеки выбрасывают все детали протокола он посылает некоторые внутренние данные и некоторые полученные данные протокола, а также (особенно при использовании FTP). Если вы используете HTTP, добавив заголовки в полученном выход для изучения также является умным способом, чтобы получить лучшее понимание того, почему сервер ведет себя так, как он делает. Включать заголовки в нормальный выход тело с множеством CURLOPT_HEADER 1.

Конечно, есть ошибки ушли. Мы должны знать о них, чтобы иметь возможность их исправить, так что мы вполне зависит от вашего сообщения об ошибке! Когда вы делаете доклад подозреваемых ошибки в Libcurl, пожалуйста, как много деталей, как вы возможно: протокол свалку, что CURLOPT_VERBOSE производит, библиотеки версии, как можно больше вашего кода, который использует Libcurl, операционные системы имен и версий, компилятор название и версию и т.д.

Если CURLOPT_VERBOSE не достаточно, вы увеличиваете уровень отладки данных приложения получают с помощью CURLOPT_DEBUGFUNCTION.

Получение некоторых глубоких знаний о протоколах, участвующих никогда не ошибается, и если вы пытаетесь сделать забавные вещи, вы можете очень хорошо понимаю Libcurl и как использовать его лучше, если вы будете изучать соответствующие документы RFC хотя бы вкратце.

Загрузка данных на удаленный сайтПравить

Libcurl пытается сохранить независящим от протокола подход к большинству передач, таким образом, загрузка на удаленный сайт по FTP очень похожа на загрузку данных на HTTP-сервер через PUT-запрос.

Вначале вам нужно создать easy-дескриптор или использовать существующий. Затем вы как и раньше устанавливаете URL. Это удаленный URL, в который мы будем отправлять данные.

Для нашего приложения мы хитим, чтобы libcurl запрашивала у нас передаваемые данные. Чтобы это сделать, мы устанавливаем обратный вызов, а также указатель, который будет передан в обратный вызов. Функция обратного вызова для чтения данных должна иметь следующий прототип:

size_t function(char *bufptr, size_t size, size_t nitems, void *userp);

Где bufptr — указатель на буфер, который заполняется отправляемыми данными, а size * nitems описывают размер буфера и, следовательно, максимальное количество данных, которое мы можем вернуться в libcurl. Указатель userp позволяет передать данные между приложением и обратным вызовом.

curl_easy_setopt(easyhandle, CURLOPT_READFUNCTION, read_function);
 
curl_easy_setopt(easyhandle, CURLOPT_READDATA, &filedata);

Скажем libcurl, что мы хотим отправить данные:

curl_easy_setopt(easyhandle, CURLOPT_UPLOAD, 1L);

Некоторым протоколам необходимо знать точное количество отправляемых данных. Поэтому, установим суммарный размер всех отправляемого файлов через опцию CURLOPT_INFILESIZE_LARGE[1]:

/* В этом примере, переменная file_size должны иметь тип curl_off_t */
curl_easy_setopt (easyhandle, CURLOPT_INFILESIZE_LARGE, file_size);

Когда вы вызовете функцию curl_easy_perform(), она выполнит всю внутреннюю работу, а затем начнёт вызывать ваш обратный вызов для получения отправляемых данных. При каждом вызове программа должна помещать в буфер максимально возможное количество данных, так как это позволяет выполнять отправку быстрее. Обратный вызов должен возвращать количество записанных в буфер байт. Возврат 0 будет означать окончание загрузки.

ПаролиПравить

Многие протоколы использовать или даже требуют, чтобы имя пользователя и пароль предоставляются, чтобы иметь возможность загружать или выгружать данные по вашему выбору. Libcurl предлагает несколько способов указать их.

Большинство протоколов поддержку, которую Вы укажите имя и пароль в URL себе. Libcurl обнаружит это и использовать их соответствующим образом. Это написано так:

протокол :/ / пользователь: password@example.com / путь /

Если вам нужно любое нечетное буквы в имени пользователя и пароля, вы должны ввести их URL кодируются, как% XX, где XX это двузначное шестнадцатеричное число.

Libcurl также предоставляет возможность задать различные пароли. Имя пользователя и пароль, как показано встроенный в URL вместо этого можно получить набор с CURLOPT_USERPWD вариант. Аргумент, передаваемый Libcurl должен быть символ * в строку в формате "пользователь: пароль". В порядке, как это:

curl_easy_setopt (easyhandle, CURLOPT_USERPWD, "MyName: thesecret");

Другой случай, когда имя и пароль может потребоваться время от времени, для тех пользователей, которым необходимо авторизоваться на прокси они используют. Libcurl предлагает еще один вариант для этого, CURLOPT_PROXYUSERPWD. Он используется очень похож на CURLOPT_USERPWD опции вроде этого:

curl_easy_setopt (easyhandle, CURLOPT_PROXYUSERPWD, "MyName: thesecret");

Там очень долго UNIX "стандартный" способ хранения FTP имена пользователей и пароли, а именно в $ HOME / .netrc. Файл должен быть частным, так что только пользователь может читать (см. также "Вопросы безопасности" главы), так как она может содержать пароль в виде простого текста. Libcurl имеет возможность использовать этот файл, чтобы выяснить, какой набор имени пользователя и пароля для конкретного узла. В качестве расширения к нормальной функциональности, Libcurl также поддерживает этот файл для не-FTP протоколов, таких как HTTP. Для того, чтобы завить использовать этот файл, используя CURLOPT_NETRC вариант:

curl_easy_setopt (easyhandle, CURLOPT_NETRC, 1л);

И очень простой пример того, как такая Netrc файл может выглядеть следующим образом.:

Машина myhost.mydomain.com логин пароль UserLogin secretword

Все эти примеры были случаи, когда пароль был обязательным, или по крайней мере вы могли бы оставить его и иметь Libcurl попытка сделать свою работу без него. Есть моменты, когда пароль не является обязательным, например, когда вы используете SSL закрытого ключа для безопасной передачи.

Для прохождения известного секретного ключа пароль, чтобы Libcurl:

curl_easy_setopt (easyhandle, CURLOPT_KEYPASSWD, "keypassword");

HTTP-аутентификацииПравить

В предыдущей главе мы показали, как задать имя пользователя и пароль для получения URL-адресов, которые требуют проверки подлинности. При использовании протокола HTTP, есть много различных способов клиент может предоставить эти учетные данные на сервер, и вы можете контролировать, каким путем будет Libcurl (попытка) их использовать. Проверки подлинности по умолчанию HTTP метод называется 'Basic', который посылает имя пользователя и пароль в виде открытого текста в запрос HTTP, base64-кодирования. Это небезопасно.

На момент написания этой статьи, Libcurl может быть построен в использовании: Basic, Digest, NTLM, Negotiate, GSS-Negotiate и SPNEGO. Вы можете сказать, Libcurl какой из них использовать с CURLOPT_HTTPAUTH как:

curl_easy_setopt (easyhandle, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);

И когда вы посылаете проверки подлинности прокси-сервер, вы также можете установить тип аутентификации так же, но вместо этого с CURLOPT_PROXYAUTH:

curl_easy_setopt (easyhandle, CURLOPT_PROXYAUTH, CURLAUTH_NTLM);

Оба этих варианта позволяют устанавливать различные типы (по ORing их вместе), чтобы сделать Libcurl выбрать наиболее безопасный один из типов серверов / прокси претензий к поддержке. Этот метод тем не менее добавим туда-обратно, так как Libcurl должны сначала спросить серверу, что он поддерживает:

curl_easy_setopt (easyhandle, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST | CURLAUTH_BASIC);

Для удобства вы можете использовать 'CURLAUTH_ANY' определим (вместо списка с определенными типами), которая позволяет Libcurl использовать любой метод он хочет.

При обращении нескольких типов, Libcurl выберет сроком на один он считает "лучшим" в своей внутренней порядке предпочтения.

HTTP объявлениеПравить

Мы получаем много вопросов о том, как выдать HTTP-сообщения с Libcurl надлежащим образом. В этой главе, таким образом, включать примеры с использованием как различные версии HTTP POST, что Libcurl поддерживает.

Первый вариант является простым POST, наиболее распространенной версии, что большинство HTML страниц с помощью использования тега <form>. Мы предоставляем указатель на данные и рассказать Libcurl разместить его все к удаленному сайту:

символ * Данные = "название = Даниэля и проект = го"; curl_easy_setopt (easyhandle, CURLOPT_POSTFIELDS, данные); curl_easy_setopt (easyhandle, CURLOPT_URL, " http://posthere.com/ ");

curl_easy_perform (easyhandle); / * сообщение прочь! * /

Достаточно просто, да? Так как вы установите POST варианты с CURLOPT_POSTFIELDS, это автоматически переключает ручку, чтобы использовать POST в предстоящем запросу.

Хорошо, так что, если вы хотите разместить двоичные данные, что также требует, чтобы установить Content-Type: заголовок поста? Ну, двоичные сообщения предотвратить Libcurl от того, чтобы делать StrLen () на данных, чтобы выяснить размеры, поэтому мы должны сказать Libcurl размер отправленных данных. Настройка заголовков в Libcurl запросы осуществляются в общем виде, путем создания списка наших собственных заголовки, а затем мимоходом, что список Libcurl.

Структура curl_slist * Заголовки = NULL; заголовки = curl_slist_append (заголовки "Content-Type: текст / XML");

/ * Сообщение двоичные данные * / curl_easy_setopt (easyhandle, CURLOPT_POSTFIELDS, binaryptr);

/ * Установить размер postfields данных * / curl_easy_setopt (easyhandle, CURLOPT_POSTFIELDSIZE, 23Л);

/ * Передать наш список на заказ заголовков * / curl_easy_setopt (easyhandle, CURLOPT_HTTPHEADER, заголовков);

curl_easy_perform (easyhandle); / * сообщение прочь! * /

curl_slist_free_all (заголовков); / * бесплатно заголовке списка * /

В то время как простые приведенные выше примеры охватывают большинство всех случаях, когда операции HTTP POST необходимы, они не делают несколько частей formposts. Multi-части formposts были введены как лучший способ размещения (возможно, большая) двоичных данных и были впервые описаны в RFC 1867 (обновлено в rfc2388). Они называются несколько частей, потому что они построены по цепочке частей, каждая часть которой единый блок данных. Каждая часть имеет свое название и содержание. Можно ведь создать и опубликовать несколько частей formpost с регулярными Libcurl поддержку POST, описанной выше, но это потребовало бы, что вы строите formpost себе и представить Libcurl. Чтобы сделать это проще, Libcurl предоставляет curl_formadd (3) . Используя эту функцию, можно добавить детали в форме. Когда вы закончите добавление частей, вы размещаете всю форму.

Следующий пример задает два простых частей текста с простым текстовым содержимым, а затем файл с двоичным содержимым и загружает все это.

Структура curl_httppost * сообщение = NULL; структуры curl_httppost * Последнее = NULL; curl_formadd (и пост, и наконец, CURLFORM_COPYNAME, "имя", CURLFORM_COPYCONTENTS, «Даниэль», CURLFORM_END); curl_formadd (и пост, и наконец, CURLFORM_COPYNAME, "проект", CURLFORM_COPYCONTENTS " локон ", CURLFORM_END); curl_formadd (и пост, и наконец, CURLFORM_COPYNAME", логотип-образ ", CURLFORM_FILECONTENT," curl.png ", CURLFORM_END);

/ * Установить форму информация * / curl_easy_setopt (easyhandle, CURLOPT_HTTPPOST, должность);

curl_easy_perform (easyhandle); / * сообщение прочь! * /

/ * Бесплатный данных пост еще раз * / curl_formfree (должность);

Multipart formposts представляют собой цепочки из частей, используя MIME-стиль сепараторов и заголовков. Это означает, что каждый из этих отдельных частей получить несколько заголовков установлено, что описания отдельных тип содержимого, размер и т.д. Для того чтобы ваше приложение ремесленных этом formpost даже больше, Libcurl позволяет предоставить собственный набор пользовательских заголовков для таких отдельные части формы. Вы можете заголовков Конечно поставки столько частей, сколько хотите, но это маленький пример покажу, как установить заголовки к одной конкретной части, когда вы добавить, что на пост ручки:

Структура curl_slist * Заголовки = NULL; заголовки = curl_slist_append (заголовки "Content-Type: текст / XML");

curl_formadd (и пост, и наконец, CURLFORM_COPYNAME ", логотип-образ", CURLFORM_FILECONTENT, "curl.xml", CURLFORM_CONTENTHEADER, заголовки, CURLFORM_END);

curl_easy_perform (easyhandle); / * сообщение прочь! * /

curl_formfree (должность); / * бесплатное сообщение * / curl_slist_free_all (заголовков); / * бесплатный настраиваемый список заголовков * /

Поскольку все параметры на easyhandle являются «липкими», они остаются такими же, пока не будут изменены, даже если вы делаете вызов curl_easy_perform (3) , вам может понадобиться, чтобы рассказать свернуться, чтобы вернуться к простой GET запрос, если вы намерены делать один, как ваш следующий запрос. Вы заставляете easyhandle, чтобы вернуться к GET с помощью CURLOPT_HTTPGET вариант:

curl_easy_setopt (easyhandle, CURLOPT_HTTPGET, 1л);

Просто установка CURLOPT_POSTFIELDS "" или NULL * не * остановка Libcurl от выполнения POST. Это будет просто сделать его пост без каких-либо данных для отправки!

Показаны Прогресс

По историческим и традиционным причинам, Libcurl имеет встроенный индикатор прогресса, который может быть включен и затем делает ее представить прогресс метра в вашем терминале.

Включите прогресса метр, как ни странно, установка CURLOPT_NOPROGRESS к нулю. Этот параметр имеет значение 1 по умолчанию.

В большинстве случаев, однако, встроенный в индикатор хода бесполезно и что вместо интересно, так это возможность указать ходе обратного вызова. Указатель функции вы передаете Libcurl будет вызван на нерегулярные промежутки времени с информацией о текущей передаче.

Установка обратного хода с помощью CURLOPT_PROGRESSFUNCTION. И передать указатель на функцию, которая соответствует этому прототипу:

Int progress_callback (недействительными * clientp, дважды dltotal, дважды dlnow, дважды ultotal, дважды ulnow);

Если любой из входных аргументов неизвестно, 0 будет принят. Первый аргумент, "clientp 'является указателем вы передаете Libcurl с CURLOPT_PROGRESSDATA. Libcurl не будет его трогать.

Libcurl с C + +

Там в основном только одна вещь, чтобы иметь в виду при использовании C + +, а не C при взаимодействии Libcurl:

Обратных вызовов НЕ МОЖЕТ быть не статические функции члена класса

Пример C + + код:

Класс AClass {статические size_t write_data (недействительными * указатель, размер size_t, size_t nmemb, недействительными * ourpointer) {/ * делать то, что вы хотите с данными * /}}

ПроксиПравить

Что такое «прокси» означает, в соответствии с Merriam-Webster: «лицо, уполномоченное действовать от имени другого", но и "агентство, функции или офиса депутата, который действует в качестве замены для друга".

Прокси чрезвычайно распространенной в наши дни. Компании часто предлагают только доступ в Интернет для сотрудников через их доверенных лиц. Сетевые клиенты или пользовательских агентов просим не использовать прокси для документов, прокси-сервер делает фактическую запрос, а затем возвращает их.

Libcurl поддерживает SOCKS и HTTP прокси. Когда данный URL находится в розыске, Libcurl будет просить прокси-сервер для этого вместо того, чтобы подключиться к фактической хозяин, указанных в URL-адресе.

Если вы используете SOCKS прокси, вы можете обнаружить, что Libcurl не совсем поддерживают все операции через него.

Для прокси-серверы HTTP: то, что прокси-сервер HTTP прокси накладывает определенные ограничения на то, что действительно может произойти. Запрашиваемая страница, которая не может быть URL HTTP-прежнему будет передаваться прокси HTTP, чтобы доставить обратно в Libcurl. Это происходит прозрачно, и приложение может не знать. Я говорю «может», потому что порой это очень важно понимать, что все операции через прокси HTTP использует протокол HTTP. Например, вы не можете вызвать свой собственный FTP-команд или даже надлежащее FTP листингов каталога.

Параметры прокси-сервераПравить

Честно Libcurl использовать прокси в данный номер порта:

curl_easy_setopt (easyhandle, CURLOPT_PROXY, "прокси-host.com: 8080");

Некоторые прокси-серверы требуют аутентификации пользователя, прежде чем разрешить запрос, и вы передаете эту информацию, подобную этой:

curl_easy_setopt (easyhandle, CURLOPT_PROXYUSERPWD, "пользователь: пароль");

Если вы хотите, вы можете указать имя хоста, только в CURLOPT_PROXY вариант, и установить номер порта отдельно с CURLOPT_PROXYPORT.

Расскажите Libcurl какой прокси это с CURLOPT_PROXYTYPE (если нет, то по умолчанию будет считать прокси HTTP):

curl_easy_setopt (easyhandle, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4);

Переменные средыПравить

Libcurl автоматически проверяет и использует набор переменных окружения, чтобы знать, что прокси использовать для определенных протоколов. Имена переменных следуют древним стандартом де-факто и строятся как "[протокол] _proxy" (обратите внимание на нижней части корпуса). Что делает "http_proxy 'переменная проверяется на имя прокси для использования при входе URL является HTTP. Следуя той же правило, переменная с именем 'ftp_proxy "проверяется на FTP URL-адресов. Опять же, прокси HTTP прокси всегда, разные имена переменных просто позволяет различные прокси-серверы HTTP, который будет использоваться.

Прокси содержимое переменной среды должна быть в формате "[протокол :/ /] [пользователь: пароль @] машина [: порт]". Где протокол :/ / часть просто игнорируется если таковые имеются (так http://proxy и bluerk :/ / прокси будет делать то же самое), а также дополнительно указывается номер порта, на котором порт прокси работает на хозяина. Если не указано, внутренний номер порта по умолчанию будет использоваться и что, скорее всего, * не * тот, который вы хотели бы его видеть.

Есть две специальные переменные окружения. "All_proxy" является то, что отличает прокси для любого URL в случае, если протокол конкретной переменной не был установлен, и "no_proxy 'определяет список хостов, которые не должны использовать прокси, хотя переменной можно так сказать. Если «no_proxy" представляет собой равнину звездочки («*») он соответствует всем хостам.

Чтобы явно отключить проверку Libcurl и для использования прокси-переменные среды, параметры прокси имя "" - пустая строка - с CURLOPT_PROXY.

SSL и проксиПравить

SSL для безопасного точка-точка соединения. Это включает в себя шифрование и тому подобных вещей, который фактически делает невозможным для прокси-сервера для работы в качестве «человек посередине», задача которого прокси-сервера, как обсуждалось ранее. Вместо этого, единственный способ иметь SSL работу через прокси HTTP, это спросить прокси туннеля все корыта, не имея возможности проверить или возиться с трафиком.

Открытие SSL соединение через прокси HTTP является для них вопросом просим прокси для прямого подключения к хост на указанный порт. Это сделано с просьбой HTTP CONNECT. ("Пожалуйста, господин прокси-сервер, подключить меня к удаленным хостом").

В связи с характером этой операции, где прокси понятия не имеет, какого рода данные, которые передаются в и через этот туннель, это нарушает некоторые из очень немногих преимуществ, которые приходят от использования прокси-сервера, такие как кэширование. Многие организации предотвращения такого рода туннелирования на другие номера порта назначения, чем 443 (который по умолчанию HTTPS номер порта).

Туннелирование через проксиПравить

Как объяснялось выше, туннелирование требуется для SSL для работы и часто даже ограничены операции предназначены для SSL, HTTPS.

Однако это не единственный раз, когда прокси-туннельных может принести выгоды для вас или вашего приложения.

Как туннелирование открывает прямой связи из вашего приложения на удаленной машине, он вдруг также вновь появилась возможность использовать не-HTTP операций через прокси HTTP. Можно ведь использование таких вещей, как FTP загрузки или FTP пользовательских команд таким образом.

Опять же, это часто препятствуют администраторов прокси-серверов и редко допускаются.

Расскажите Libcurl использовать прокси туннелирование вроде этого:

curl_easy_setopt (easyhandle, CURLOPT_HTTPPROXYTUNNEL, 1л);

На самом деле, может быть даже время, когда вы хотите сделать простой операции HTTP использованием туннеля, как это, как то позволяет работать на удаленном сервере, а не просить прокси для этого. Libcurl не будет стоять на пути таких инновационных действий либо!

Proxy Auto-ConfigПравить

Netscape сначала придумали это. Это в основном веб-страницы (обычно используются. Пак расширения) с Javascript, что при выполнении в браузере с просьбой URL в качестве входных данных, возвращает информацию в браузер о том, как подключиться к URL. Возвращается информация может быть "DIRECT" (что означает отсутствие прокси должны быть использованы), "ПРОКСИ-хост: порт" (указать браузеру, где прокси-сервера для данного URL есть) или "SOCKS хост: порт" (направить браузера к прокси SOCKS).

Libcurl не имеет средств, чтобы интерпретировать и оценивать Javascript и поэтому он не поддерживает это. Если вы окажетесь в положении, когда вы сталкиваетесь с этой неприятной изобретения, следующие рекомендации были упомянуты и использовался в прошлом:

- В зависимости от сложности Javascript, напишите сценарий, который переводит его на другой язык и выполнить это.

- Прочитать код Javascript и переписать ту же логику на другом языке.

- Реализация интерпретатора Javascript, люди успешно использовали движок Mozilla Javascript в прошлом.

- Спросите у администраторов, чтобы остановить это, для статической настройки прокси-сервера или аналогичный.

Стойкость это путь к счастьюПравить

Сайклинг-же легко ручку несколько раз, когда делаете несколько запросов путь.

После каждой отдельной curl_easy_perform (3) операции, Libcurl будет поддерживать соединение и открытым. Последующий запрос с использованием тех же легко ручку на тот же хост может просто быть в состоянии использовать уже открытые соединения! Это уменьшает влияние сети много.

Даже если соединение обрывается, все соединения с участием SSL на тот же хост снова выиграет от сессии Libcurl по ID кэша, что значительно снижает повторное подключение времени.

FTP соединения, которые продолжают жить сэкономить много времени, так как команда-ответ обращений пропускаются, а также вы не рискуете получать их без разрешения войти снова, как на многих FTP-серверах только позволяет N лица должны войти в систему в то же время.

Libcurl кэширует DNS разрешения имен результаты, чтобы сделать поиск ранее посмотрела назвать намного быстрее.

Другие интересные детали, которые улучшают производительность для последующих запросов также могут быть добавлены в будущем.

Каждая ручка легко будет пытаться держать несколько последних соединений жив, а в случае, если они будут использоваться снова. Вы можете установить размер этого "кэш" с возможностью CURLOPT_MAXCONNECTS. Значение по умолчанию 5. Существует очень редко любой момент изменить это значение, и если вы думаете, изменение этого он часто просто вопрос думать снова.

Чтобы заставить Вашего предстоящего просьба не использовать уже существующее соединение (он даже близко одна первая, если случается, один жив на тот же хост вы собираетесь работать), вы можете сделать это, установив CURLOPT_FRESH_CONNECT 1. В том же духе, вы также можете запретить предстоящих просьбу "лежа" вокруг и, возможно, получить повторно использоваться после запроса, установив CURLOPT_FORBID_REUSE 1.

Заголовки HTTP Используется LibcurlПравить

При использовании Libcurl делать HTTP запросы, он будет проходить вдоль ряда заголовки автоматически. Это может быть хорошо для вас, чтобы знать и понимать это. Вы можете заменить или удалить их с помощью CURLOPT_HTTPHEADER вариант.

Хозяин

Этот заголовок требует HTTP 1.1 и даже многие серверы 1,0 и должно быть имя сервера, мы хотим, чтобы говорить. Это включает в себя номер порта, если угодно, но по умолчанию.

Принимать

"* / *".

Ожидать

При выполнении POST запросов, Libcurl устанавливает этот заголовок "100-продолжать" обратиться к серверу "OK" сообщение, прежде чем она протекает с передачей данных части поста. Если Добавлено объем данных считается "малым", Libcurl не будет использовать этот заголовок.

Настройка операцийПравить

Существует постоянное развитие сегодня, когда все больше и больше протоколы строятся на HTTP для транспорта. Это имеет очевидные преимущества, как HTTP является проверенным и надежным протоколом, который широко распространен и имеет отличные прокси-поддержку.

При использовании одного из этих протоколов, и даже когда делаю другие виды программирования вам может понадобиться изменить традиционный HTTP (или FTP или ...) манерах. Возможно, вам придется изменить слова, заголовки или различных данных.

Libcurl является вашим другом здесь.

CUSTOMREQUESTПравить

Если только изменение реального запроса HTTP ключевое слово, что вы хотите, например, когда GET, HEAD и POST не является достаточно хорошим для вас, CURLOPT_CUSTOMREQUEST есть для вас. Он очень прост в использовании:

curl_easy_setopt (easyhandle, CURLOPT_CUSTOMREQUEST, "MYOWNREQUEST");

При использовании пользовательский запрос, вы измените запрос ключевое слово фактического запроса вы выполняете. Таким образом, по умолчанию вы делаете GET запрос, но вы также можете сделать после операции (как описано выше), а затем заменить POST ключевое слово, если хотите. Ты босс.

Modify HeadersПравить

HTTP-протоколы, как пройти ряд заголовков на сервер при выполнении запроса, и вы можете свободно пройти любое количество дополнительных заголовков, которые вы считаете нужным. Добавление заголовков это просто:

Структура curl_slist * Заголовки = NULL; / * инициализации в NULL важно * /

Заголовки = curl_slist_append (заголовки: «Эй-эй-сервер: как ты"); заголовки = curl_slist_append (заголовки "X-глупо-контента: да");

/ * Передать наш список на заказ заголовков * / curl_easy_setopt (easyhandle, CURLOPT_HTTPHEADER, заголовков);

curl_easy_perform (easyhandle); / * передача HTTP * /

curl_slist_free_all (заголовков); / * бесплатно заголовке списка * /

... и если вы думаете, некоторые из внутренне созданный заголовки, такие как Accept: или Host: не содержат данных, которые вы хотите, чтобы они содержат, вы можете заменить их, просто установив их тоже:

Заголовки = curl_slist_append (заголовки, "Accept: Агент-007"); заголовки = curl_slist_append (заголовки, "Host: munged.host.line");

Удалить заголовкиПравить

Если вы замените существующий заголовок с одним, не содержание, вы предотвратите заголовок не был отправлен. Например, если вы хотите, чтобы полностью предотвратить "Accept:" заголовок не был отправлен, вы можете отключить его код, подобный этому:

Заголовки = curl_slist_append (заголовки, "Accept:");

Оба замене и отмена внутренних заголовков должно быть сделано при тщательном рассмотрении, и вы должны знать, что вы можете нарушать протокол HTTP, делая так.

Обеспечение разбит Transfer-EncodingПравить

По убедившись, что запрос использует пользовательский заголовок "Transfer-Encoding: фрагментированное", когда делаешь не-HTTP GET операции, Libcurl перейдет на "разбит" загрузку, даже если размер данных для загрузки может быть известно. По умолчанию, Libcurl обычно переключается на фрагментированное загрузить автоматически, если размер загружаемого файла данных неизвестно.

Версия HTTPПравить

Все HTTP-запросов включает в себя номер версии, чтобы сообщить серверу, какую версию мы поддерживаем. Libcurl говорит HTTP 1.1 по умолчанию. Некоторые очень старые серверы не нравится получать 1,1-запросы и при работе с упрямой старой вещи, как, что, можно сказать, Libcurl использовать вместо 1,0, делая что-то вроде этого:

curl_easy_setopt (easyhandle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);

FTP Специальные командыПравить

Не все протоколы HTTP-как, и, таким образом, выше, не может помочь вам, когда вы хотите, чтобы, например, ваш FTP переводы вести себя по-разному.

Отправка пользовательских команд FTP сервера означает, что вам необходимо отправить команды именно так, как FTP-сервер ожидает от них ( RFC 959 является хорошим ориентиром здесь), и вы можете использовать только команды, которые работают на контрольно-соединения в одиночку. Все виды команд, которые требуют обмена данными и поэтому нуждаются в данных соединение должно быть оставлено на собственное суждение Libcurl автора. Также помните, что Libcurl будет делать все возможное для изменения каталога в целевой каталог, прежде чем делать любую передачу, так что если вы измените каталог (с УХО и т.п.) вы могли бы запутать Libcurl и то он не может попытаться передать файл в правильном удаленный каталог.

Небольшой пример, который удаляет данный файл перед операцией:

Заголовки = curl_slist_append (заголовки, "DELE файла до удаления");

/ * Передать список пользовательских команд на ручке * / curl_easy_setopt (easyhandle, CURLOPT_QUOTE, заголовков);

curl_easy_perform (easyhandle); / * Передача данных FTP! * /

curl_slist_free_all (заголовков); / * бесплатно заголовке списка * /

Если вы вместо этого хотите эту операцию (или цепочки операций) происходит _after_ передачи данных состоялся возможность curl_easy_setopt (3) вместо этого будет называть CURLOPT_POSTQUOTE и использовать точно так же.

Пользовательскую команду FTP будет опубликован на сервере в том же порядке их добавления в список, и если команда получает код ошибки, возвращаемый с сервера, не более команд будет издан и Libcurl будет выручить с кодом ошибки (CURLE_QUOTE_ERROR). Обратите внимание, что если вы используете CURLOPT_QUOTE для отправки команд перед передачей, без перевода будет на самом деле происходит, когда цитата команды не удалось.

Если вы установите CURLOPT_HEADER до 1, скажете вы Libcurl, чтобы получить информацию о файле цели и выход "Заголовки" о нем. Заголовки будет в "HTTP-стиль", глядя, как они делают в HTTP.

Возможность включить заголовки или для запуска пользовательских команд FTP может быть полезно сочетать с CURLOPT_NOBODY. Если этот параметр установлен, никакой фактической передачи содержимого файла будет выполнена.

FTP Пользовательский CUSTOMREQUESTПравить

Если вы хотите просмотреть содержимое FTP каталога, используя собственный FTP определена команда, CURLOPT_CUSTOMREQUEST будет делать именно это. "NLST" является по умолчанию для включения в список каталогов, но вы можете свободно пройти в ваше представление о хорошей альтернативой.

Печенье без шоколадной стружкойПравить

В том смысле, HTTP, печенье имя связано значение. Сервер отправляет имя и значение для клиента, и ожидает, что отправляют обратно на каждый последующий запрос на сервер, который соответствует конкретным условиям установки. К этим условиям относятся, что доменное имя и путь матче и о том, что печенье не стало слишком стар.

В реальных случаях, серверы отправляют новые печенье для замены существующих для их обновления. Печенье на использование Сервера "отслеживать" пользователей и сохранить "сессии".

Cookies передаются от сервера к клиентам с заголовка Set-Cookie: и они отправлены от клиента к серверу с Cookie: заголовка.

Чтобы просто написать все, что вы хотите печенья на сервер, вы можете использовать CURLOPT_COOKIE установить печенья строку следующим образом:

curl_easy_setopt (easyhandle, CURLOPT_COOKIE, "name1 = var1; name2 = var2;");

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

Один из способов это сделать, это сохранить все заголовки, вы получаете в обычный файл и когда вы сделаете запрос, вы говорите Libcurl прочитать предыдущие заголовках чтобы выяснить, какие печенья в использовании. Установить заголовок файла для чтения печенье с с CURLOPT_COOKIEFILE.

CURLOPT_COOKIEFILE опция также позволяет автоматически печенье анализатор в Libcurl. До печенье анализатор включен, Libcurl не будет разбирать или не понимают входящие печенье и они будут просто игнорироваться. Однако, когда анализатор включен печенье будет понята и печенье будут сохранены в памяти и использованы должным образом в последующих запросах, когда же ручка используется. Много раз это достаточно, и вы не можете иметь, чтобы сохранить печенье на диске вообще. Обратите внимание, что файл, который вы укажите в CURLOPT_COOKIEFILE не должны существовать для того, чтобы парсер, так распространенный способ просто включить анализатор, а не читать куки использовать имя файла, вы знаете, не существует.

Если вы предпочитаете использовать существующие куки, которые Вы ранее полученных с Netscape или Mozilla браузерах, вы можете сделать Libcurl использования, печенье файл в качестве входных данных. CURLOPT_COOKIEFILE используется для этого тоже, как Libcurl будет автоматически выяснить, какой файл это и действовать соответственно.

Пожалуй, самый продвинутый Libcurl печенье работы предлагает, спасает весь внутреннего состояния печенья обратно в Netscape / Mozilla файл в формате печенья. Мы называем это печенье-банку. Когда вы устанавливаете имя файла с CURLOPT_COOKIEJAR, что имя файла будет создана и получила все куки будут храниться в нем, когда curl_easy_cleanup (3) называется. Это позволяет печенье, чтобы передаются должным образом между несколькими ручками без какой-либо информации заблудиться.

FTP Особенности Нам нужныПравить

FTP переводы использовать второй TCP / IP соединения для передачи данных. Как правило, это то, что вы можете забыть и игнорировать, но иногда этот факт будет вернуться к преследовать вас. Libcurl предлагает несколько различных способов настройки, как второе соединение делается.

Libcurl можно либо подключиться к серверу второй раз, или сказать сервер для подключения к нему спиной. Первый вариант используется по умолчанию, и это также то, что лучше всего работает для всех людей, за брандмауэрами, NAT или IP-маскировкой установок. Libcurl затем сообщает серверу, чтобы открыть новый порт и дождаться второго соединения. Это по умолчанию пытался с EPSV первым, и если это не работает, он пытается вместо PASV. (EPSV является дополнением к оригинальной спецификации FTP и не существует ни работать на всех FTP серверов.)

Вы можете предотвратить Libcurl с первой попытки EPSV команду, установив CURLOPT_FTP_USE_EPSV к нулю.

В некоторых случаях, вы предпочитаете, чтобы сервер подключиться к вам за второе соединение. Это может быть, когда сервер, возможно, брандмауэр или что-то, и разрешает только соединения по этому порту. Libcurl затем информирует удаленный сервер, IP-адрес и номер порта для подключения. Это делается с помощью опции CURLOPT_FTPPORT. Если вы установите его на "-", Libcurl будет использовать ваши системы "по умолчанию IP-адрес". Если вы хотите использовать конкретный IP, вы можете установить полный IP-адрес, имя хоста, к разрешению в IP-адрес или даже локальное имя сетевого интерфейса, что Libcurl получит IP-адрес от.

При выполнении "PORT" подход, Libcurl будет пытаться использовать EPRT и LPRT, прежде чем пытаться PORT, так как они работают с несколькими протоколами. Вы можете отключить это поведение, установив CURLOPT_FTP_USE_EPRT к нулю.

Заголовки Равное FunПравить

Некоторые протоколы обеспечивают "Заголовки", мета-данные отделены от нормальных данных. Эти заголовки по умолчанию не включен в нормальном потоке данных, но вы можете сделать их в поток данных, установив CURLOPT_HEADER 1.

Что может быть еще более полезным, является способность Libcurl к отделить заголовки от данных, и тем самым сделать обратные вызовы отличаются. Например, вы можете установить различные указатель перейти к обычной записи обратного вызова, установив CURLOPT_WRITEHEADER.

Или, вы можете установить совершенно отдельную функцию для получения заголовков, с помощью CURLOPT_HEADERFUNCTION.

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

"Заголовки" для переводов FTP равно все ответы FTP-сервер. Они не являются на самом деле правда заголовки, но в этом случае мы делаем вид, что они есть! ;-)

Сообщение передаче информацииПравить

[Curl_easy_getinfo]

Вопросы безопасностиПравить

Libcurl проект берет безопасности серьезно. Библиотека написана с осторожностью и меры предосторожности, чтобы смягчить многие виды рисков, возникающих при работе с потенциально вредоносные серверы в Интернете. Это мощная библиотека, однако, что позволяет приложению писатели, чтобы сделать компромиссы между простотой написания и потенциальными рискованные операции. Если используется должным образом, вы можете использовать Libcurl для передачи данных довольно благополучно.

Многие приложения используют в закрытых сетях, где пользователи и серверы можно доверять, но и многие другие используются на произвольный сервер и подаются входные из потенциально ненадежных пользователей. Ниже приводится обсуждение некоторых рисков в пути, в которых приложения используют Libcurl и потенциальных смягчения этих рисков. Это далеко не полный, но показывает классы атак, что надежные приложения должны рассмотреть. Общий проект перечисление Слабость в http://cwe.mitre.org/ является хорошим источником информации для многих из этих и подобных типов слабые стороны, применение которых писатели должны знать.

Командных строкПравить

Если вы используете инструмент командной строки (например, ротор), который использует Libcurl, и вы даете вариантов инструмент командной строки этих вариантов может весьма вероятно, читается другими пользователями системы, когда они используют 'PS' или других инструментов список запущенных процессов.

Чтобы избежать этой проблемы, никогда не кормите чувствительные вещи программ с использованием параметров командной строки. Запишите их в защищенный файл и использовать-K вариант, чтобы избежать этого.

. NetrcПравить

. Netrc является довольно удобным файле / функция, которая позволяет вам войти быстро и автоматически к часто посещаемым сайтам. Этот файл содержит пароли в открытом виде и является реальной угрозой безопасности. В некоторых случаях, ваш. Netrc также хранятся в домашнем каталоге, NFS установлены или использованы на другом сетевая файловая система, поэтому текстовый пароль будет летать по сети каждый раз, когда кто-то читает этот файл!

Чтобы избежать этой проблемы, не используют. Netrc файлов и никогда не храните пароли в виде обычного текста в любом месте.

Текстовые паролиПравить

Многие из протоколов Libcurl поддерживает отправить имя и пароль незашифрованном виде текста (HTTP Basic аутентификация, FTP, TELNET и т.д.). Это очень удобно для тех, кто в вашей сети или сети поблизости ваш просто запустить инструмент сетевого анализатора и прослушивать ваши пароли. Не позволяйте тем, что HTTP Basic использует base64 закодированный пароль вводит вас в заблуждение. Они могут не читается, на первый взгляд, но они очень легко "расшифровать" по любому течение нескольких секунд.

Чтобы избежать этой проблемы, использовать HTTP методы аутентификации или другие протоколы, которые не позволяют шпионов увидеть ваш пароль: HTTP с Digest, NTLM аутентификацию или GSS, HTTPS, FTPS, SCP, SFTP и FTP-протокола Kerberos несколько примеров.

ПеренаправленияПравить

CURLOPT_FOLLOWLOCATION опция автоматически следует HTTP перенаправления отправлен на удаленный сервер. Эти перенаправления может обратиться к любому URL, а не только HTTP. Перенаправить в файл: URL приведет к тому, Libcurl для чтения (или записи) произвольных файлов из локальной файловой системы. Если приложение возвращает данные обратно пользователю (как это происходит в некоторых видах CGI скриптов), злоумышленник может использовать это, чтобы прочитать иначе запрещено данных (например, файл :/ / локальный / и т.д. / пароль).

Если учетные данные хранятся в файле ~ /. Netrc файл, или Kerberos используется, любой другой тип URL (не только файл :) которая требует проверки подлинности также находится под угрозой. Перенаправление таких как ftp://some-internal-server/private-file затем возвращать данные, даже если сервер защищен паролем.

Таким же образом, если незашифрованном SSH закрытый ключ был настроен для пользователя, запустившего приложение Libcurl, SCP: или SFTP: URL может получить доступ пароль или секретный ключ защищенным ресурсам, например, с ftp://user @ некоторыми внутренними- сервер / и т.д. / пароль

CURLOPT_REDIR_PROTOCOLS и CURLOPT_NETRC опции могут быть использованы для смягчения от такого рода атак.

Перенаправление можно также указать местоположение доступна только на машине под управлением Libcurl, в том числе серверов скрыты за брандмауэром от злоумышленника. например, http://127.0.0.1/ или http://intranet/delete-stuff.cgi ? удаления = все или т ftp://bootp-server/pc-config-data

Приложения могут смягчить против этого, отключив CURLOPT_FOLLOWLOCATION и обработка перенаправления себя, дезинфекции URL-адресов по мере необходимости. С другой стороны, приложение может оставить CURLOPT_FOLLOWLOCATION включен, но установить CURLOPT_REDIR_PROTOCOLS и установить функцию обратного вызова CURLOPT_OPENSOCKETFUNCTION, в котором адреса проверяются перед использованием.

Частные ресурсыПравить

Пользователь, который может управлять сервером DNS в домен передается в пределах URL может изменить адрес хоста на локальный, частный адрес, применение Libcurl будет использовать. например, безобидный URL http://fuzzybunnies.example.com/ действительно может разрешаться в IP-адрес сервера, брандмауэра, такие как 127.0.0.1 или 10.1.2.3 приложения можно смягчить, установив CURLOPT_OPENSOCKETFUNCTION и проверки адресов Перед соединением.

Все вредоносных сценариев, касающихся перенаправлены URL-адресов, также применимо к не-перенаправлены URL-адреса, если пользователь может указать произвольный URL, которые могли бы указывать на частных ресурсов. Например, веб-приложение, предоставление переводческих услуг может счастливо перевести файл :/ / локальный / и т.д. / пароль и отображать результат. Приложения могут смягчить это с CURLOPT_PROTOCOLS опции, а также аналогичные методы смягчения последствий для перенаправления.

Вредоносного FTP сервер может в ответ на команду PASV вернуть IP-адрес и номер порта для сервера, локальные приложение работает Libcurl но за брандмауэром. Приложения могут смягчить это, используя опцию CURLOPT_FTP_SKIP_PASV_IP или CURLOPT_FTPPORT.

ПоступленияПравить

При загрузке, перенаправление может вызвать локальную (или удаленного) файла будут перезаписаны. Приложения не должны позволить любое unsanitized URL будет принят в течение добавления. Кроме того, CURLOPT_FOLLOWLOCATION не должны быть использованы на загрузку. Вместо этого, приложение должно обрабатывать переадресации себя, дезинфекции каждый URL в первую очередь.

ИдентификацияПравить

Использование CURLOPT_UNRESTRICTED_AUTH может привести к информации аутентификации для отправки в неизвестном второй сервер. Приложения могут смягчить против этого, отключив CURLOPT_FOLLOWLOCATION и обработка перенаправления себя, дезинфекции в случае необходимости.

Использование CURLAUTH_ANY возможность CURLOPT_HTTPAUTH может привести к имени пользователя и пароля передаются в незашифрованном виде на сервер HTTP. Вместо этого, используйте CURLAUTH_ANYSAFE который гарантирует, что пароль шифруется по сети, либо неудачу запроса.

Использование CURLUSESSL_TRY возможность CURLOPT_USE_SSL может привести к имени пользователя и пароля передаются в незашифрованном виде на FTP-сервер. Вместо этого, используйте CURLUSESSL_CONTROL, чтобы зашифрованное соединение используется либо неудачу запроса.

ПеченьеПравить

Если куки включены и кэшируется, то пользователь может обработать URL, который выполняет некоторые вредоносные действия на сайте которого аутентификация уже хранится в куки. например, http://mail.example.com/delete-stuff.cgi ? удаления = все приложения могут смягчить против этого, отключив печенье или очищая их между запросами.

Опасные URL-адресовПравить

SCP URL-адреса может содержать сырые команды в УПП: URL, который является побочным эффектом, как SCP протокол предназначен. например, SCP :/ / пользователь: пароль @ узел /; дата> / TMP / испытания; приложения не должны позволить unsanitized SCP: URL-адресов, которые передаются в для загрузки.

Отказ в обслуживанииПравить

Вредоносный сервер может привести к Libcurl эффективно висят на отправку струйка данных через, или даже вообще не представили данных, а просто поддерживать соединение TCP открытым. Это может привести к отказу в обслуживании нападение. CURLOPT_TIMEOUT и / или CURLOPT_LOW_SPEED_LIMIT опции могут быть использ

ованы для смягчения против этого.


Вредоносный сервер может привести к Libcurl эффективно висеть начинает передавать данные, а затем ра

зрывая соединение без чисто закрытие соединения TCP. Приложение может установить функцию обратного вызова CURLOPT_SOCKOPTFUNCTION и установить опцию TCP SO_KEEPALIVE для смягчения против этого. Установка одного из тайм-аут вариантов также будет работать против этой атаки.

Вредоносный сервер может привести к Libcurl скачать бесконечное количество данных, что может привести всю память или жесткий диск должны быть заполнены. Установка CURLOPT_MAXFILESIZE_LARGE вариант не достаточно, чтобы защититься от этого. Вместо этого, приложение должно контролировать объем данных, полученных в ходе записи или обратного вызова и отмены раза предела.

Вредоносный сервер HTTP может привести к бесконечному циклу перенаправления, вызывая отказ в обслуживании. Это может быть устранена с помощью CURLOPT_MAXREDIRS вариант.

Произвольные заголовкиПравить

Компоненты, поставляемые пользователем данные должны быть продезинфицировать при использовании опции, как CURLOPT_USERAGENT, CURLOPT_HTTPHEADER, CURLOPT_POSTFIELDS и другие, которые используются для создания структурированных данных. Символы, такие как встроенные возврат каретки или амперсанд может позволить пользователю создавать дополнительные заголовки или поля, которые могут привести вредоносных операций.

Сервер поставляемые именаПравить

Сервер может поставлять данные, которые приложение может, в некоторых случаях, использовать в качестве имени файла. Локон инструмент командной строки делает это с - дистанционное заголовка именем, используя Content-распоряжения: заголовок, чтобы создать имя файла. Приложение может также использовать CURLINFO_EFFECTIVE_URL для генерации имени файла с сервера, поставляемого перенаправление URL. Особое внимание должно быть принято, чтобы санировать такие имена, чтобы избежать возможности сервера злоумышленников подачи одного вроде "/ и т.д. / пароль", "autoexec.bat" или даже ". Bashrc".

Сертификаты сервераПравить

Защищенное приложение никогда не должны использовать CURLOPT_SSL_VERIFYPEER возможность отключения проверки сертификатов. Есть множество атак, которые включены по приложений, которые не в состоянии должным образом проверку сервера TLS / SSL сертификатов, что позволяет вредоносному серверу подменить законным. HTTPS без подтверждено сертификатами является потенциально небезопасной, как в виде простого соединения HTTP.

Показаны What You DoПравить

В этой же связи следует помнить, что даже в таких ситуациях, когда у вас есть проблемы с Libcurl и попросить кого-нибудь о помощи, все, что вам выявить, чтобы получить наилучшую помощь также может накладывать определенные риски, связанные с безопасностью. Имена хостов, имен пользователей, дорожки, особенности функционирования системы, и т.д. (не говоря уже, конечно, пароли), могут на самом деле быть использованы злоумышленниками для получения дополнительной информации о потенциальной цели.

Чтобы избежать этой проблемы, необходимо, конечно, использовать ваш здравый смысл. Часто, вы можете просто отредактировать конфиденциальные данные или просто поиск / замена вашей истинной информации с поддельными данными.

Многочисленные переводы с помощью многофункционального интерфейсаПравить

Простой интерфейс, как подробно описано в данном документе, синхронный интерфейс, который передает одним файлом в то время и не возвращаться, пока это делается.

Многофункциональный интерфейс, с другой стороны, позволяет программе переводить несколько файлов в обоих направлениях в то же время, не вынуждая вас использовать несколько потоков. Название может сделать его показаться, что несколько интерфейсов для многопоточных программ, но на самом деле почти наоборот. Многофункциональный интерфейс может позволить однопоточных приложений для выполнения тех же видах нескольких одновременных переводов, что многопоточные программы могут выполнять. Это позволяет многим из преимуществ многопоточной переводы без сложность управления и синхронизации нескольких потоков.

Чтобы использовать этот интерфейс, вы лучше, если вы сначала понять основы того, как использовать простой интерфейс. Многофункциональный интерфейс это просто способ сделать несколько переводов в то же время путем сложения нескольких легкой ручки в "мульти стека".

Вы создаете легко обрабатывает вы хотите, и вы установите все опции, как вы сказали выше, а затем вы создаете несколько ручка с curl_multi_init (3) и добавить все те легкие ручки к этому несколько ручка с curl_multi_add_handle (3) .

Когда вы добавили ручки у вас есть на данный момент (вы все еще ​​можете добавлять новые в любое время), вы начинаете переводы по телефону curl_multi_perform (3) .

curl_multi_perform (3) является асинхронным. Он будет выполняться только как можно меньше, а затем вернуться управление вашей программе. Он предназначен для не блокировать.

Лучшее использование этого интерфейса, когда вы делаете выбор () для всех возможных файловых дескрипторов или гнезда знать, когда звонить Libcurl снова. Это также делает его легким для вас, чтобы ждать и реагировать на действия на сокеты собственные приложения / ручки. Вы выяснить, что выбрать () путем использования curl_multi_fdset (3) , который заполняет набор fd_set для вас переменные с конкретными файловых дескрипторов Libcurl используется на данный момент.

Когда вы затем вызвать выберите (), он будет возвращаться, когда один из файловых дескрипторов действия сигнала, и вы затем вызвать curl_multi_perform (3) , чтобы Libcurl делать то, что он хочет делать. Обратите внимание, что Libcurl действительно также есть некоторые тайм-аут код поэтому мы советуем вам никогда не использовать очень длинный тайм-ауты на выбор () перед вызовом curl_multi_perform (3) , которые при этом должны быть безоговорочно называют то и дело, даже если ни один из его файлов Дескрипторы дали понять, готова. Еще одной мерой предосторожности, вы должны использовать: всегда вызывают curl_multi_fdset (3) непосредственно перед выберите () вызова с текущим набором дескрипторов файлов может измениться при вызове функции локон.

Если вы хотите, чтобы остановить передачу одного из легкого ручки в стек, вы можете использовать curl_multi_remove_handle (3) , чтобы удалить отдельные легкой ручки. Помните, что легкий ручки должны быть curl_easy_cleanup (3) изд.

При передаче в нескольких стек закончил, счетчик работает переводов (как заполняется curl_multi_perform (3) ), будет уменьшаться. Когда число достигает нуля, все переводы выполняются.

curl_multi_info_read (3) может быть использован для получения информации о выполненных переводов. Затем он возвращается CURLcode для каждого Easy Transfer, которая позволяет выяснить успеха на каждом отдельном передачи.

SSL, сертификаты и другие хитростиПравить

[Посева, пароли, ключи, сертификаты, двигатель, около сертификаты]

Обмен данными между легким ручкиПравить

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

Когда вы добавляете легкой ручки к многопартийной ручки, эти простые ручки будут автоматически обмениваться большим количеством данных, которые в противном случае будут сохраняться на уровне легкой ручкой основе, когда простой интерфейс используется.

Кэш DNS распределяется между ручками в течение нескольких ручкой, что делает последующее resolvings Название быстрее и пул соединений, которые хранятся лучше позволить постоянные соединения и подключения повторного использования является общим. Если вы используете простой интерфейс, вы можете поделиться этим между конкретными легкой ручки с помощью долю интерфейса см. Libcurl-акция (3).

Некоторые вещи никогда не разделял автоматически, а не в нескольких ручек, как, например, печенье поэтому единственный способ разделить это с долей интерфейс. Сноски

[1] Libcurl 7.10.3 и более поздних есть возможность переключиться на фрагментированное Transfer-Encoding в случаях, когда HTTP добавления сделали с данными неизвестного размера.

[2] Это происходит на машинах Windows, когда Libcurl построен и использован в качестве DLL. Тем не менее, вы все равно можете сделать это на Windows Если вы связываете со статической библиотекой.

[3] Локон-Config Tool создается при построении времени (на UNIX-подобных систем) и должна быть установлена ​​с "сделать установки" или аналогичные инструкции, которая устанавливает библиотеки, файлы заголовков, человек страниц и т.д.

[4] Такое поведение было по-другому в версии до 7.17.0, где строки были, остаются в силе в конце прошлого curl_easy_setopt() вызов.

Это незавершенная статья
Она содержит неполную информацию
Вы можете помочь Libcurlru вики, дополнив её.

Ошибка цитирования Для существующего тега <ref> не найдено соответствующего тега <references/>

Обнаружено использование расширения AdBlock.


Викия — это свободный ресурс, который существует и развивается за счёт рекламы. Для блокирующих рекламу пользователей мы предоставляем модифицированную версию сайта.

Викия не будет доступна для последующих модификаций. Если вы желаете продолжать работать со страницей, то, пожалуйста, отключите расширение для блокировки рекламы.

Также на Фэндоме

Случайная вики