Что нового

[Сеть, интернет] TCPHttp.au3 (отправка/приём http запросов при помощи TCP функций, асинхронность)

HukpoFuJl

AццkuЙ HukpoFuJl
Сообщения
97
Репутация
38
AutoIt: 3.3.6.1
Версия: v0.1

Категория: Сеть, интернет

Описание: Простой аналог виндовским COM объектам WinHttpRquest.5.1 и Microsoft.XMLHTTP посторенный на использовании TCP функций. Можно использовать для отправки http пакетов и приёма файлов (я использую для второго)...

Код:
#include <TcpHttp.au3>

TCPStartup()

$MyGET = _TCPHttpOpen ("GET","http://autoit-script.ru/index.php?action=dlattach;attach=1083;type=avatar")
_TCPHttpSetRequestHeader ('Host','autoit-script.ru')
_TCPHttpSetRequestHeader ('User-Agent','Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0) HukpoSoft_FHD/1.0')
_TCPHttpSetRequestHeader ('Connection','close')
_TCPHttpSend ($MyGET)

$fileH = FileOpen('Temp.gif',16+2)
ConsoleWrite(@CRLF&'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-')
ConsoleWrite(@CRLF&'+ Статус ответа '&_TCPHttpGetStatus($MyGET))
$headers = _TCPHttpGetAllResponseHeaders ($MyGET)
$header_num = @extended
$header = StringSplit ($headers,@CRLF,1)
For $e = 1 To $header_num
	ConsoleWrite(@CRLF&'! Заголовок №'&$e&'/'&$header_num&': '&$header[$e])
	If StringInStr ($header[$e],'Content-Length') Then $fSize = StringFindSE ($header[$e],'Content-Length: ','')
Next
ConsoleWrite(@CRLF&'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-')
_TCPHttpGetResponseBodyBG ($MyGET)
While 1
	If $TCPHTTP_CURBYTES > 0 Then TrayTip ("Скачано",$TCPHTTP_CURBYTES&"/"&$fSize,100,2)
	If $TCPHTTP_CURBYTES = '-1' Then ExitLoop
	Sleep(100)
WEnd
$fDataSize = BinaryLen ($TCPHTTP_BODY)
FileWrite($fileH,$TCPHTTP_BODY)
FileClose ($fileH)
ConsoleWrite(@CRLF&'> Заявленный размер файла = '&$fSize&' байт')
ConsoleWrite(@CRLF&'> Размер полученых данных = '&$fDataSize&' байт')
ConsoleWrite(@CRLF&'> Итоговый размер файла = '&FileGetSize('Temp.gif')&' байт'&@CRLF)

TCPShutdown()
Exit

TCPHttp.au3 (4.7Kb)

[box title=Список функций]
Создаёт сокет для последующего http запроса.
_TCPHttpOpen ($type,$link[,$protocol])
Параметры функции:
$typeТип запроса (GET, POST, HEAD, ...)
$linkАдрес запроса
$protocolОпционально. Протокол (HTTP/0.9, HTTP/1.0, HTTP/1.1). По умолчанию используется HTTP/1.1
Возвращаемые значения:
При успешном выполнении: Возвращает ID созданного сокета (используеться для отправки пакета и приёма данных). @error = 0 @extended = 0
При ошибке: Возвращает 0. Устанавливаются значения:
@error = -1 (Неверная ссылка) @extended = 0
@error = -2 (Не удалось преобразовать имя хоста в IP адрес) @extended = значение windows API WSAGetError
@error = -3 (Не удалось создать сокет) @extended = 0
Добавляет заголовок запроса.
_TCPHttpSetRequestHeader ($header,$value)
Параметры функции:
$headerЗаголовок запроса (например "User-Agent")
$valueЗначение заголовка запроса (например "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)")
Возвращаемые значения:
При успешном выполнении: Возвращает 1, в значение @extended записывается количество переданных заголовков. @error = 0
При ошибке: Возвращает 0. Устанавливает значение @error = -1 (Заголовок, и/или его значение пусты) @extended = 0
Добавляет список заголовков запроса.
_TCPHttpSetRequestHeader ($headers)
Параметры функции:
$headersЗаголовки запроса в формате "заголовок: значение"&@CRLF
Возвращаемые значения:
При успешном выполнении: Возвращает 1. @error = 0 @extended = 0
При ошибке: Возвращает 0. Устанавливаются значения:
@error = -1 (Передаваемая строка пуста) @extended = 0
@error = -2 (Одна из строк не является заголовком) @extended = номер строки
Отправляет пакет.
_TCPHttpSend ($Socket,[$value])
Параметры функции:
$SocketСокет, созданный функцией _TCPHttpOpen
$valueОпционально. Передаваемые параметры (например "user=name&password=mypass")
Возвращаемые значения:
При успешном выполнении: Возвращает 1. @error = 0 @extended = количество переданных байт
При ошибке: Возвращает 0. Устанавливается значение @error = -1 (Не удалось отправить пакет) @extended = значение windows API WSAGetError
Получает и возвращает статус пакета.
_TCPHttpGetStatus ($Socket)
Параметры функции:
$SocketСокет, созданный функцией _TCPHttpOpen
Возвращаемые значения:
При успешном выполнении: Возвращает статус (например 200, 404, 302 и т.п.). @extended = Статусное сообщение. @error = 0
При ошибке: Возвращает 0. Устанавливается значение @error = -1 (невозможно получить пакет) @extended = 0

Примечание: Вызов этой функции обязателен при приёме пакета, даже если вам не важен статус ответа. Функцию стоит вызывать только один раз для каждого пакета, для повторного получения статуса этого же пакета пользуйтесь функцией _TCPHttpStatus.
Возвращает статус пакета.
_TCPHttpStatus ($Socket)
Параметры функции:
$SocketСокет, созданный функцией _TCPHttpOpen
Возвращаемые значения:
При успешном выполнении: Возвращает статус (например 200, 404, 302 и т.п.). @error = 0 @extended = 0
При ошибке: Возвращает 0. Устанавливается значение @error = -1 (Пакет ещё не получен) @extended = 0

Примечание: Служит для возвращения ранее полученного статуса. Не путать с функцией _TCPHttpGetStatus.
Получает и возвращает заголовки ответа.
_TCPHttpGetAllResponseHeaders ($Socket)
Параметры функции:
$SocketСокет, созданный функцией _TCPHttpOpen
Возвращаемые значения:
При успешном выполнении: Возвращает все заголовки ответа. @extended = Количество заголовков ответа. @error = 0
При ошибке: Возвращает 0. Устанавливается значение @error = -1 (невозможно получить пакет) @extended = 0

Примечание: Вызов этой функции обязателен при приёме пакета, даже если вам не важны заголовки ответа. Функцию стоит вызывать только один раз для каждого пакета, для повторного получения заголовков ответа этого же пакета пользуйтесь функцией _TCPHttpAllResponseHeaders. Для успешного выполнения необходимо, чтобы была ранее выполнена функця _TCPHttpGetStatus
Возвращает заголовки ответа.
_TCPHttpAllResponseHeaders ($Socket)
Параметры функции:
$SocketСокет, созданный функцией _TCPHttpOpen
Возвращаемые значения:
При успешном выполнении: Возвращает все заголовки ответа. @error = 0 @extended = 0
При ошибке: Возвращает 0. Устанавливается значение @error = -1 (Пакет ещё не получен) @extended = 0

Примечание: Служит для возвращения ранее полученных заголовков ответа. Не путать с функцией _TCPHttpGetAllResponseHeaders.
Возвращает cookie, полученные из заголовков ответа.
_TCPHttpResponseCookies ($Socket)
Параметры функции:
$SocketСокет, созданный функцией _TCPHttpOpen
Возвращаемые значения:
При успешном выполнении: Возвращает все cookie's в строке, вида "cookie1=value1; cookie2=value2; cookie3=value3". @extended = Количество полученых cookie @error = 0
При ошибке: Возвращает 0. Устанавливаются значения:
@error = -1 (Пакет ещё не получен) @extended = 0
@error = -2 (Не найдено ни одного cookie) @extended = номер строки

Примечание: Служит для возвращения cookie's из ранее полученных заголовков ответа. Для успешного выполнения необходимо, чтобы были ранее выполнены функции _TCPHttpGetStatus и _TCPHttpGetAllResponseHeaders.
Получает и возвращает тело ответа.
_TCPHttpGetResponseBody ($Socket[,$isBinary])
Параметры функции:
$SocketСокет, созданный функцией _TCPHttpOpen
$isBinaryОпционально. Режим получения данных в бинарном виде. 1(по умолчанию) - бинарные данные, 2 - строковые данные.
Возвращаемые значения:
При успешном выполнении: Возвращает тело ответа. @extended = количество байт ответа @error = 0
При ошибке: Возвращает 0. Устанавливается значение @error = -1 (Пакет ещё не получен) @extended = 0

Примечание: Служит для возвращения тела ответа. Для успешного выполнения необходимо, чтобы были ранее выполнены функции _TCPHttpGetStatus и _TCPHttpGetAllResponseHeaders.
Т.к. при приёме в строковом виде (функцией TCPRecv) игнорируются некоторые символы, в данной функции приём происходит в бинарном виде и только потом, в зависимости от выбора, конвертируются в строковый.
Получает тело ответа в фоновом режиме.
_TCPHttpGetResponseBodyBG ($Socket)
Параметры функции:
$SocketСокет, созданный функцией _TCPHttpOpen
Возвращаемые значения:
При успешном выполнении: Возвращает 1. @error = 0 @extended = 0
При ошибке: Устанавливается значение @error = -1 (невозможно получить пакет) @extended = 0

Примечание: Служит для возвращения тела ответа в фоновом режиме. Для успешного выполнения необходимо, чтобы были ранее выполнены функции _TCPHttpGetStatus и _TCPHttpGetAllResponseHeaders. Функция принимает первый(пробный) байт тела ответа и регистрирует на выполнение каждые 250мс. функцию _TCPHttpGetResponseBodyAdlib, которая в последствии в течении загрузки устанавливает значения глобальных величин:
$TCPHTTP_CURBYTES = сколько байт тела ответа загружено. (если тело ответа загружено полностью - значение устанавливается в "-1")
$TCPHTTP_BODY = само тело ответа.
$TCPHTTP_SOCKET = сокет.
Только одна загрузка может выполняться в фоновом режиме одновременно. При старте новой фоновой загрузки, не дожидаясь завершения текущей - текущая загрузка будет прервана.
_TCPHttpGetResponseBodyAdlib ()

Примечание: Функция регистрируется в AdlibRegister и постоянно обновляет значения $TCPHTTP_CURBYTES и $TCPHTTP_BODY, по завершению приёма данных функция сама делает AdlibUnRegister и устанавливает значение $TCPHTTP_CURBYTES = "-1".

Примечания: Перед началом использования функций данной библиотеки необходимо инициализировать TCP протокол функцией TCPStartup().
После использования соответственно завершить функцией TCPShutdown().
При прикреплении библиотеки объявляются следующие глобальные переменные:
$sCommand - для временного хранения тела запроса.
$TCPHTTP_CURBYTES - для хранения текущего количества принятых байт (при загрузке в фоновом режиме).
$TCPHTTP_BODY - для хранения тела ответа в процессе загрузки и после её (при загрузке в фоновом режиме).
$TCPHTTP_SOCKET - для временного хранения сокета (при загрузке в фоновом режиме).
Также в библиотеке присутствует моя функция StringFindSE. Она к библиотеке отношения не имеет, но в некоторых её функциях используется.
[/box]

[box title=История версий:]13.08.2010 - v0.1 первая версия[/box]

Источник: Эта страница и является первоисточником.
Автор: HukpoFuJl

ЗЫ: Библиотека относительно сырая, так что сильно не пинайте... Если есть что предложить - предлагайте, я делаю так, как умею и/или как мне удобно, так что упрёки "ты здесь сделал не так" игнорируются (если что-то не нравится - предложите по-другому)...


UPD: Перезалил на местный файлообменник и добавил во вложения к сообщению.
 
Верх