Весь инет перерыл, не могу понять по какому принципу работает запрос CONNECT, я так понимаю стандартной реализацией http-прокси тут не обойтись? Может кто-нибудь этим вопросом занимался, и подскажет?
Все просто. Из заголовка выбираешь хост: http://ХОСТ или из параметра "HOST: "ХОСТ потом коннетишься на него если все ОК то посылаешь КЛИЕНТУ ответ с кодом 200 - Все путем "HTTP/1.0 200 Connection Established\r\n\r\n" Потом начинаешь взаимную передачу как кто-нить только закроет соединение то отрубайся.
пишу хттпс прокси, через снифер смотрю, вроди трафик идет а не работает почему-то 1. принимаю от клиента запрос. 2. как аргументы CONNECT беру хост и порт. 3. шлю клиенту HTTP/1.0 200 Connection Established\r\n\r\n 4. конекчюсь к серваку по указанному хосту и порту 5. получаю ответ от клиента bytes_recv = recv(socket_client, buf, sizeof(buf), 0); 6. посылаю это серваку send(socket_server, buf, bytes_recv, 0); 7. в цикле принимаю данные от сервака и шлю клиенту while( (bytes_recv = recv(socket_server, buf, sizeof(buf), 0)) > 0) { if(send(socket_client, buf, bytes_recv, 0) <= 0) break; } может у кого есть мысли по этому поводу?
Порядок работы должен быть такой: 1. Парсишь запрос, например Код (Text): CONNECT 64.12.161.185:443 HTTP/1.0 User-agent: ICQ/2000b (Mozilla 1.24b; Windows; I; 32-bit) 2. Коннектишся на 64.12.161.185:443 3. Если сконнектился, отсылаешь прокси-клиенту "HTTP/1.0 200 Ok\n", если нет, то "HTTP/1.0 502 Error\n" 4. Начинаешь обмен данными. Эта схема работает у меня и на асме и на с++.
делаю так, но видимо, не определяется конец передачи данных. Код (Text): // Приконектились к указанному хосту на указанный порт и послал клиенту HTTP/1.0 200 Connection Established\r\n\r\n если конект удался, затем: bytes_recv = recv(socket_client, buf, sizeof(buf), 0); send(socket_server, buf, bytes_recv, 0); while( (bytes_recv = recv(socket_server, buf, sizeof(buf), 0)) > 0) { if(send(socket_client, buf, bytes_recv, 0) <= 0) break; } closesocket(socket_server); closesocket(socket_client); покажи пожалуйста кусок кода где идет обмен данными.
Ты видимо смысл https прокси не понял: там смысл как и в соксе, т.е. ты должен принимать запросы от прокси-клиента и передавать их серверу, и наоборот... а у тебя в этом участке принимаются данные от сервера и передаются клиенту... смотри событийную модель или ч-з select Код (Text): while( (bytes_recv = recv(socket_server, buf, sizeof(buf), 0)) > 0) { if(send(socket_client, buf, bytes_recv, 0) <= 0) break; } просто блокирующими сокетами https прокси и сокс не сделать.
понятно. переделал до Код (Text): while(1) { bytes_recv = recv(socket_client, buf, sizeof(buf), 0); if(bytes_recv < 0 || bytes_recv == WSAECONNRESET) { break; } else { if(send(socket_server, buf, bytes_recv, 0) <= 0) break; } bytes_recv = recv(socket_server, buf, sizeof(buf), 0); if(bytes_recv < 0 || bytes_recv == WSAECONNRESET) { break; } else { if(send(socket_client, buf, bytes_recv, 0) <= 0) break; } } трафика теперь больше через прокси идет но всеравно не работает