реализация https прокси

Тема в разделе "WASM.NETWORKS", создана пользователем samba, 7 окт 2005.

  1. samba

    samba New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    65
    Адрес:
    England
    Весь инет перерыл, не могу понять по какому принципу работает запрос CONNECT, я так понимаю стандартной реализацией http-прокси тут не обойтись?

    Может кто-нибудь этим вопросом занимался, и подскажет?
     
  2. khv_test

    khv_test New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    135
    Все просто.

    Из заголовка выбираешь хост:

    http://ХОСТ или из параметра "HOST: "ХОСТ

    потом коннетишься на него если все ОК то

    посылаешь КЛИЕНТУ ответ с кодом 200 - Все путем "HTTP/1.0 200 Connection Established\r\n\r\n"

    Потом начинаешь взаимную передачу как кто-нить только закроет соединение то отрубайся.
     
  3. samba

    samba New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    65
    Адрес:
    England
    >khv_test

    Спасибо тебе, именно то что я хотел услышать.
     
  4. KAdot

    KAdot New Member

    Публикаций:
    0
    Регистрация:
    27 фев 2005
    Сообщения:
    38
    пишу хттпс прокси, через снифер смотрю, вроди трафик идет а не работает почему-то

    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;
    }

    может у кого есть мысли по этому поводу?
     
  5. 10_Brasil

    10_Brasil New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    54
    Порядок работы должен быть такой:

    1. Парсишь запрос, например
    Код (Text):
    1. CONNECT 64.12.161.185:443 HTTP/1.0
    2. 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. Начинаешь обмен данными.

    Эта схема работает у меня и на асме и на с++.
     
  6. KAdot

    KAdot New Member

    Публикаций:
    0
    Регистрация:
    27 фев 2005
    Сообщения:
    38
    делаю так, но видимо, не определяется конец передачи данных.
    Код (Text):
    1. // Приконектились к указанному хосту на указанный порт и послал клиенту HTTP/1.0 200 Connection Established\r\n\r\n если конект удался, затем:
    2.  
    3. bytes_recv = recv(socket_client, buf, sizeof(buf), 0);
    4. send(socket_server, buf, bytes_recv, 0);
    5.  
    6. while( (bytes_recv = recv(socket_server, buf, sizeof(buf), 0)) > 0)
    7. {
    8.     if(send(socket_client, buf, bytes_recv, 0) <= 0) break;
    9. }
    10. closesocket(socket_server);
    11. closesocket(socket_client);
    покажи пожалуйста кусок кода где идет обмен данными.
     
  7. 10_Brasil

    10_Brasil New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    54
    Ты видимо смысл https прокси не понял: там смысл как и в соксе, т.е. ты должен принимать запросы от прокси-клиента и передавать их серверу, и наоборот...

    а у тебя в этом участке принимаются данные от сервера и передаются клиенту...
    смотри событийную модель или ч-з select
    Код (Text):
    1. while( (bytes_recv = recv(socket_server, buf, sizeof(buf), 0)) > 0)
    2. {
    3.     if(send(socket_client, buf, bytes_recv, 0) <= 0) break;
    4. }
    просто блокирующими сокетами https прокси и сокс не сделать.
     
  8. KAdot

    KAdot New Member

    Публикаций:
    0
    Регистрация:
    27 фев 2005
    Сообщения:
    38
    понятно. переделал до
    Код (Text):
    1. while(1)
    2.     {
    3.         bytes_recv = recv(socket_client, buf, sizeof(buf), 0);
    4.         if(bytes_recv < 0 || bytes_recv == WSAECONNRESET)
    5.         {
    6.             break;
    7.         }
    8.         else
    9.         {
    10.             if(send(socket_server, buf, bytes_recv, 0) <= 0) break;
    11.         }
    12.  
    13.         bytes_recv = recv(socket_server, buf, sizeof(buf), 0);
    14.         if(bytes_recv < 0 || bytes_recv == WSAECONNRESET)
    15.         {
    16.             break;
    17.         }
    18.         else
    19.         {
    20.             if(send(socket_client, buf, bytes_recv, 0) <= 0) break;
    21.         }
    22.     }
    трафика теперь больше через прокси идет но всеравно не работает
     
  9. 10_Brasil

    10_Brasil New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    54
    еще раз повторяю блокируюбщие сокеты тут не катят! у тебя элементранно зависание на recv-е идет...
     
  10. KAdot

    KAdot New Member

    Публикаций:
    0
    Регистрация:
    27 фев 2005
    Сообщения:
    38
    спасибо! сделал с помощью select, теперь работает