HTTPS: чтение ответа через сокеты

Найч

Алгоритмик :-)
HTTPS: запрос и чтение ответа через сокеты

Hi!
Необходимо через HTTPS отправить запрос на сервер и прочитать ответ.
Поскольку одно из требований - "мультипоточность" запросов, то реализовал через socket_select (CURL multi_init недоступен - пхп4, с fsocket не работает socket_select).

Сам коннект идет через
PHP:
$sock_one = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$result = socket_connect($sock_one, $some_host, $port);
При посылке запросов через 80 порт
Код:
POST /test.php HTTP/1.1
Host: testhost.com
Content-type: application/x-www-form-urlencoded
Content-Length: 9
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

some data
сервер возвращает ожидаемый результат

Читаю (после socket_select)
PHP:
$rawdata = socket_read($resource, 20*1024);
Если указать 443 порт, то коннектится, но ругается при попытке читать
Код:
Warning: socket_read() unable to read from socket [10054]: Удаленный хост принудительно разорвал существующее подключение.
Подскажите, плз, каким образом через SSL отправить запрос? Или каков должен быть запрос?

Смотрел через Proxomitron заголовки при общении браузера через https
Код:
SSL cipher TLSv1 RC4-MD5 (128 bits)
GET /test.php HTTP/1.1
Host: some_host.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Pragma: no-cache
Cache-Control: no-cache
Connection: keep-alive
Пока не очень помогло.
 

Найч

Алгоритмик :-)
Я не очень представляю, какие заголовки надо послать и в каком виде данные...
 

whirlwind

TDD infected, paranoid
Я щас не вспомню точно различаются они или нет (сдается нет). Есть такая либа Snoopy. Полгляди, с ее помощью очень легко работать по SSL, просто подпись указываешь. Ну если интересно как это работает на низком уровне, никто не помешает заглянуть вовнутрь ;)
 

Найч

Алгоритмик :-)
Вещь хорошая, кроме одного "но": по http ходит через сокеты, а по https через curl (командная строка).
За подсказку спасибо, но пока не вариант
 

ForJest

- свежая кровь
Поскольку одно из требований - "мультипоточность" запросов, то реализовал через socket_select (CURL multi_init недоступен - пхп4, с fsocket не работает socket_select).
Запускай несколько процессов PHP и в каждый засовывай по курлу.
 

Найч

Алгоритмик :-)
Был и такой вариант, но тогда пришлось бы следить на временем жизни каждого из дочерних процессов (по превышению лимита прибивать). Мне видится на порядок больше проблем, нежели с socket_select.
Зачем надо: отправить на несколько gateway'ев запросы по просчету их цен за услуги. Скрипт должен уложиться в определенное время - все запросы, не вложившиеся в общий лимит, не учитываются.
 

whirlwind

TDD infected, paranoid
Как найдешь решение, обязательно постани. Уверен, что многим пригодится (в т.ч. и мне ;)
 

ForJest

- свежая кровь
Найч
Мне видится на порядок больше проблем, нежели с socket_select.
А с тем, что тебе ВРУЧНУЮ нужно формировать и следить за всеми данными SSL - тебя не смущает? Ну хотя если тебе легче изучить аспекты SSL чем написать простой скриптик следящий за несколькими pid-ами -то в добрый путь :).
Я лично не гений в этом, поэтому воспользовался бы curl. Но, видимо у тебя способность усваивать громадные объёмы информации выше и времени много :).
 

Profic

just Profic (PHP5 BetaTeam)
Эээ. Люди, а что вы курили?
HTTPS это бинарный протокол ssl + http поверх него. И переписывать первый на голом php - верх безумия.
1) [m]wrappers.http[/m]
2) [m]fsockopen[/m]() + [m]transports[/m]
+ Ко всему этому [m]stream_select[/m](), именно stream, а не socket.
 

Найч

Алгоритмик :-)
Большое спасибо. Вариант с stream_select + fsockopen почти замечательно работает :)
 
Сверху