Что нового

[Данные, строки] Отделение тела ответа от http-заголовков.

Gzzk

Новичок
Сообщения
104
Репутация
1
Здравствуйте.
Как можно отделить тело ответа сервера от http-заголовков?
Пример ответа:
Код:
HTTP/1.1 200 OK
Server: cloudflare-nginx
Date: Thu, 07 Nov 2013 11:25:03 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.4.16
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
CF-RAY: c99a90f36b40479

1
1
0
Заранее благодарю за ответы.
 

sngr

AutoIT Гуру
Сообщения
981
Репутация
391
вот смотри пример с TCP-функциями AutoIt
 
Автор
G

Gzzk

Новичок
Сообщения
104
Репутация
1
Видел,но мне-то не http-заголовки нужны,а ответ сервера.
 

sngr

AutoIT Гуру
Сообщения
981
Репутация
391
Код:
$str='HTTP/1.1 200 OK'&@crlf&'Server: cloudflare-nginx'&@crlf&'Date: Thu, 07 Nov 2013 11:25:03 GMT'&@crlf& _
'Content-Type: text/html; charset=UTF-8'&@crlf&'Transfer-Encoding: chunked'&@crlf&'Connection: keep-alive'& _
@crlf&'X-Powered-By: PHP/5.4.16'&@crlf&'Expires: Thu, 19 Nov 1981 08:52:00 GMT'&@crlf& _
'Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0'&@crlf&'Pragma: no-cache' _
&@crlf&'CF-RAY: c99a90f36b40479'&@crlf&''&@crlf&'1'&@crlf&'1'&@crlf&'0'
MsgBox(32,'',StringRegExpReplace($str,'(?s).*?\r\n\r\n',''))
 
Автор
G

Gzzk

Новичок
Сообщения
104
Репутация
1
Пытался сам вкурить что не так,но не нашёл ошибки,вроде всё ок должно быть,однако меседж бокс пустой.
Код:
#include <Array.au3>
$sRequest = 'POST /login/get_proflie_id.php HTTP/1.1' & @CRLF ;Request-строка, параметры GET-запроса
$sRequest &= 'Host: turboliker.ru' & @CRLF
$sRequest &= 'Content-Length: 35' & @CRLF
$sRequest &= 'Accept: */*' & @CRLF
$sRequest &= 'Origin: http://turboliker.ru' & @CRLF
$sRequest &= 'X-Requested-With: XMLHttpRequest' & @CRLF
$sRequest &= 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36' & @CRLF
$sRequest &= 'Content-Type: application/x-www-form-urlencoded' & @CRLF
$sRequest &= 'Referer: http://turboliker.ru/' & @CRLF
$sRequest &= 'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4' & @CRLF 
$sRequest &= 'Cookie: __cfduid=d6803ff16d54393950ad0c572b48221b41383831371519; PHPSESSID=fsb6esaur8ru7t5l58cbch2n51'& @CRLF & @CRLF
$sRequest &= 'link=http%3A%2F%2Fvk.com%2Fdota_pak' & @CRLF
$sbuf=SendPocket($sRequest,"turboliker.ru",80,2)
Func SendPocket($sRequest,$sHost,$iPort=80,$iReturn=2) ;1 - заголовки, 2 - тело, 3 - всё.
;ConsoleWrite($sRequest&@CRLF)
If TCPStartup() = 0 Then ;запускаем TCP/UDP-службы
    MsgBox(16, 'Ошибка', 'Не удалось запустить TCP/UDP-службы.')
    Exit 1
EndIf

$sIP = TCPNameToIP($sHost) ;получаем ip-адрес

If @error Then
    MsgBox(16, 'Ошибка', 'Не удалось получить ip-адрес сервера.')
    Exit 2
EndIf

$iSocket = TCPConnect($sIP, $iPort) ;соединяемся с сервером

If @error Then
    MsgBox(16, 'Ошибка', 'Не удалось соединиться с сервером.')
    Exit 3
EndIf

TCPSend($iSocket, $sRequest) ;отправляем сообщение

If @error Then
    MsgBox(16, 'Ошибка', 'Не удалось отправить запрос.')
    Exit 4
EndIf

$sData = Binary('')
$iTimer = TimerInit() ;запускаем таймер

Do
    $sBuffer = TCPRecv($iSocket, 1024, 1) ;ДОБАВЛЕНО
    $iError = @error
    If $sBuffer Then ;ИЗМЕНЕНО
        $sData &= BinaryToString($sBuffer, 4) ;ИЗМЕНЕНО
        $iTimer = TimerInit() ;обнуляем таймер
    EndIf
Until $iError <> 0 Or TimerDiff($iTimer) > 5000 ;если при получении сообщения произошла ошибка (данные получены, соединение закрыто) или в течении 5 секунд ничего не было получено, выход из цикла
TCPCloseSocket($iSocket)
TCPShutdown()
ConsoleWrite($sData&@CRLF)
if($iReturn = 3) Then
	Return $sData
Else
Switch $iReturn
Case 1
		$aData = StringRegExp($sData, '(?s)(.*?)\r\n\r\n(.*)', 3)
		Return $aData[0]
    Case 2
		MsgBox(32,'',StringRegExpReplace($sData,'(?s).*?\r\n\r\n',''))
		;$aData = StringRegExpReplace($sData,'(?s).*?\r\n\r\n','')
		;_ArrayDisplay($aData)
		;ConsoleWrite($aData[1]&@CRLF)	
		;Return $aData[1]
	EndSwitch	
EndIf
EndFunc
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Gzzk

Так?
Код:
#include <Array.au3>

Global $sData, $aData

$sRequest = 'POST /login/get_proflie_id.php HTTP/1.1' & @CRLF ;Request-строка, параметры GET-запроса
$sRequest &= 'Host: turboliker.ru' & @CRLF
$sRequest &= 'Content-Length: 35' & @CRLF
$sRequest &= 'Accept: */*' & @CRLF
$sRequest &= 'Origin: http://turboliker.ru' & @CRLF
$sRequest &= 'X-Requested-With: XMLHttpRequest' & @CRLF
$sRequest &= 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36' & @CRLF
$sRequest &= 'Content-Type: application/x-www-form-urlencoded' & @CRLF
$sRequest &= 'Referer: http://turboliker.ru/' & @CRLF
$sRequest &= 'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4' & @CRLF
$sRequest &= 'Cookie: __cfduid=d6803ff16d54393950ad0c572b48221b41383831371519; PHPSESSID=fsb6esaur8ru7t5l58cbch2n51' & @CRLF & @CRLF
$sRequest &= 'link=http%3A%2F%2Fvk.com%2Fdota_pak' & @CRLF

$sbuf = SendPocket($sRequest, "turboliker.ru", 80, 2)	;	$sRequest = запрос, $sHost = хост, $iPort = порт, $iReturn = 1 - заголовки, 2 - тело, 3 - всё.

If IsArray($aData) Then
	_ArrayDisplay($aData)
Else
	MsgBox(32, 'Info', $sData)
EndIf

Func SendPocket($sRequest, $sHost, $iPort, $iReturn)

	If TCPStartup() = 0 Then ;запускаем TCP/UDP-службы
		MsgBox(16, 'Ошибка', 'Не удалось запустить TCP/UDP-службы.')
		Exit 1
	EndIf

	$sIP = TCPNameToIP($sHost) ;получаем ip-адрес

	If @error Then
		MsgBox(16, 'Ошибка', 'Не удалось получить ip-адрес сервера.')
		Exit 2
	EndIf

	$iSocket = TCPConnect($sIP, $iPort) ;соединяемся с сервером

	If @error Then
		MsgBox(16, 'Ошибка', 'Не удалось соединиться с сервером.')
		Exit 3
	EndIf

	TCPSend($iSocket, $sRequest) ;отправляем сообщение

	If @error Then
		MsgBox(16, 'Ошибка', 'Не удалось отправить запрос.')
		Exit 4
	EndIf

	$sData = Binary('')
	$iTimer = TimerInit() ;запускаем таймер

	Do
		$sBuffer = TCPRecv($iSocket, 1024, 1) ;ДОБАВЛЕНО
		$iError = @error
		If $sBuffer Then ;ИЗМЕНЕНО
			$sData &= BinaryToString($sBuffer, 4) ;ИЗМЕНЕНО
			$iTimer = TimerInit() ;обнуляем таймер
		EndIf
	Until $iError <> 0 Or TimerDiff($iTimer) > 5000 ;если при получении сообщения произошла ошибка (данные получены, соединение закрыто) или в течении 5 секунд ничего не было получено, выход из цикла
	TCPCloseSocket($iSocket)
	TCPShutdown()

	Switch $iReturn
		Case 1
			$aData = StringRegExp($sData, '(?is)(\S+)?[\:].*?\R', 3)
			Return $aData
;~ 			MsgBox(32, 'Inf', UBound($aData)-1)
;~ 			For $i = 0 To UBound($aData) - 1
;~ 				ConsoleWrite($aData[$i] & @LF)
;~ 			Next
		Case 2
			$aData = StringRegExp($sData, '(?is).*?[\:]\s+?(.*?)\R', 3)
			Return $aData
;~ 			MsgBox(32, 'Inf', UBound($aData)-1)
;~ 			For $i = 0 To UBound($aData) - 1
;~ 				ConsoleWrite($aData[$i] & @LF)
;~ 			Next
		Case 3
			Return $sData
;~ 			MsgBox(32, 'Inf', $sData)
;~ 			ConsoleWrite($sData & @LF)
	EndSwitch

EndFunc   ;==>SendPocket
 
Автор
G

Gzzk

Новичок
Сообщения
104
Репутация
1
Не,я,судя по всему,плохо объясняю.
Есть такой ответ:
Код:
HTTP/1.1 200 OK
Server: cloudflare-nginx
Date: Thu, 07 Nov 2013 11:25:03 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.4.16
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
CF-RAY: c99a90f36b40479

1
1
0
Нужно вырезать во втором свиче:
Код:
1
1
0
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Gzzk,
Два варианта.
Код:
$sRead = 'HTTP/1.1 200 OK' & @CRLF & _
		'Server: cloudflare-nginx' & @CRLF & _
		'Date: Thu, 07 Nov 2013 11:25:03 GMT' & @CRLF & _
		'Content-Type: text/html; charset=UTF-8' & @CRLF & _
		'Transfer-Encoding: chunked' & @CRLF & _
		'Connection: keep-alive' & @CRLF & _
		'X-Powered-By: PHP/5.4.16' & @CRLF & _
		'Expires: Thu, 19 Nov 1981 08:52:00 GMT' & @CRLF & _
		'Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0' & @CRLF & _
		'Pragma: no-cache' & @CRLF & _
		'CF-RAY: c99a90f36b40479' & @CRLF & @CRLF & _
		'222' & @CRLF & _
		'3333' & @CRLF & _
		'444444444444444444444444444'

;~ 1
$aRead = StringRegExp($sRead, '(?s)^(.+?)[\r\n]{4}(.*)$', 3)
ConsoleWrite('HEAD: ' & @LF & $aRead[0] & @LF)
ConsoleWrite('---' & @LF & @LF)
ConsoleWrite('Content: ' & @LF & $aRead[1] & @LF)
ConsoleWrite('==========' & @LF & @LF & @LF)
;~ 2
$sHead = StringRegExpReplace($sRead, '(?s)[\r\n]{4}.*$', '')
ConsoleWrite('HEAD: ' & @LF & $sHead & @LF)
ConsoleWrite('---' & @LF & @LF)
$sContent = StringRegExpReplace($sRead, '(?s)^.*[\r\n]{4}', '')
ConsoleWrite('Content: ' & @LF & $sContent & @LF)
 
Верх