Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Про HTTP или куда девается контент?  (Прочитано 13471 раз)
0 Пользователей и 1 Гость смотрят эту тему.
kvv157
Гость
« : 19-11-2007 11:31 » 

Всем привет! Сразу к делу, проблема в следующем:
Создан простой HTTP клиент на win сокетах. Он постредством команды POST отправляет запрос серверу.
Если напрямую, без прокси, то все уходит, все приходит. Все работает.
Но стоит включить прокси и картина следующая:
заголовок приходит:
Код:
HTTP/1.1 200 OK
Date: Mon, 19 Nov 2007 10:27:18 GMT
Server: Apache
Transfer-Encoding: chunked
Content-Type: text/html; charset=windows-1251
а ТЕЛА (контента) нет!
С помощью программы InetCrack формирую вручную запрос и отправляю - работает ответ есть:
Код:
HTTP/1.1 200 OK
Date: Mon, 19 Nov 2007 10:25:00 GMT
Server: Apache
Content-Type: text/html; charset=windows-1251
Proxy-Connection: close

0000034801SM000000910000009100000121
....
END SIGNATURE

причем если посмотреть, то заголовки ответов отличаются на
Transfer-Encoding: chunked
и
Proxy-Connection: close.
Я так понимаю, что программа не умеет ходить через проксю.
В чем может быть дело ?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 19-11-2007 14:46 » 

kvv157, смотри различия в заголовках запросов. Приведи их здесь.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
kvv157
Гость
« Ответ #2 : 19-11-2007 15:02 » 

1) Вот что отправляю (пишу ручками) из программы IternetCrack (через нее работает)

Код:
POST /cgi-bin/b2/b2_pay_status.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 418
Host: payment.cyberplat.ru

inputmessage=ТУТ контент запроса

Вот что отлавливает HTTP сниффер (фактически уходит, я так понимаю):
POST http://payment.cyberplat.ru:80/cgi-bin/b2/b2_pay_status.cgi HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 418
Proxy-Connection: keep-alive
Host: payment.cyberplat.ru

inputmessage=ТУТ контент запроса
(Жирным выделены различия)

2) Вот что отправляет моя прога (через нее НЕ работает)
Код:
POST /cgi-bin/b2/b2_pay_status.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 418
Host: payment.cyberplat.ru

inputmessage=ТУТ контент запроса
То же самое отлавливает и HTTP сниффер.

Причем то что выделено жирным добавлял себе в прогу все равно не проходит.


Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 19-11-2007 23:51 » 

kvv157, в случае прокси первая строка запроса важна.

Эти протоколы стандартизированы и описаны в RFC - стоит их читать.

Хм. Киберплат работает по незащищенному каналу?..
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
kvv157
Гость
« Ответ #4 : 20-11-2007 05:57 » 

kvv157, в случае прокси первая строка запроса важна.

Эти протоколы стандартизированы и описаны в RFC - стоит их читать.
Я и говорю, что то что жирным я пробовал подставлять к себе в прогу, но все равно не пашет.
Почему? Т.е. если я правильно понял, то для правильной работы программы с прокси надо правильно составить HTTP запрос. Т.е. дело не в самой проге (например в программировании сокетов), а только в правильности HTTP запроса.
Мне вот это важно понять, правильно вывод сделал ?
Хм. Киберплат работает по незащищенному каналу?..

(Вырезка из протокола взаимодействия)
Программное взаимодействие с платежной системой осуществляется посредством открытых каналов связи сети Internet с использованием протоколов семейства TCP/IP. Передача данных сводится к обмену сообщениями в рамках протокола прикладного уровня HTTP (RFC2068,RFC2616). Возможно применение SSL прослойки (HTTPS). В первом случае соединение с сервером устанавливается по 80 порту, во втором – по 443.
Запросы доставляются до сервера платежной системы методом POST. Значение HTTP заголовка “Content-Type” должно быть равно “application/x-www-form-urlencoded”. Заголовок “Content-Length” должен содержать верное значение.
Тело запроса передается таким же образом, как и данные, введенные в HTML форму.
Существует три типа запросов к платежной системе:
-   Получение разрешения на платеж (проверка номера телефона на корректность)
-   Оплата
-   Проверка состояния платежа
Для каждого из трех типов запросов используется свой URI (уникальный идентификатор ресурса). Для каждого оператора связи используется своя тройка адресов.
Если на этапе проверки номера сумма платежа неизвестна, то надо делать 2 проверки номера (1-я на фиктивную сумму, 2-я на реальную). Код сессии платежа должен совпадать с кодом сессии второй проверки номера.

Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 20-11-2007 07:14 » 

Еще один момент заметил: ты посылаешь запрос по протоколу 1.1, а InetCrack - 1.0. Для современных прокси это не должно быть существенно, но протоколы работы с прокси для них имеют различия.

Поле "Proxy-Connection" не обязательно. Я ты поставил его в значение "close".
Поле "Transfer-Encoding: chunked" в ответе в данном случае не существенно.
Рекомендую добавить в запрос поле "User-Agent" - не помню, обязательное ли это поле, но многие сервера отказываются обслуживать запрос без него.

Попробуй отправить напрямую на прокси следующий запрос:
Код:
POST http://payment.cyberplat.ru/cgi-bin/b2/b2_pay_status.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 418
Proxy-Connection: close
Host: payment.cyberplat.ru
User-agent: xxx

......

Напрямую - это через telnet:
> telnet 1.2.3.4 3128 - это IP и порт прокси
А дальше делаешь copy-paste своего запроса.
Следи, чтобы Content-Length соответствовало реальности. В крайнем случае можно по варьировать +0..2.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
kvv157
Гость
« Ответ #6 : 20-11-2007 12:15 » 

Еще один момент заметил: ты посылаешь запрос по протоколу 1.1, а InetCrack - 1.0. Для современных прокси это не должно быть существенно, но протоколы работы с прокси для них имеют различия.

Да я тоже это заметил. Пробовал ставить HTTP 1.0 то же самое - контента нет. Плюс в ответе исчезает строка Transfer-encoding: chunked. А появляется: Connection:close.

Поле "Proxy-Connection" не обязательно. Я бы поставил его в значение "close".
Рекомендую добавить в запрос поле "User-Agent"

Тоже так пробовал, не проходит и все.

Попробуй отправить напрямую на прокси следующий запрос:
Код:
POST http://payment.cyberplat.ru/cgi-bin/b2/b2_pay_status.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 418
Proxy-Connection: close
Host: payment.cyberplat.ru
User-agent: xxx

......

Напрямую - это через telnet:
> telnet 1.2.3.4 3128 - это IP и порт прокси
А дальше делаешь copy-paste своего запроса.
Следи, чтобы Content-Length соответствовало реальности. В крайнем случае можно по варьировать +0..2.
Можно про это поподробней. У меня почему то не получается в copy-paste сделать.
Блин, уже попробовал через 1С(внеш. dll V7Plus отправить запрос- все работает). Запустил аську, просмотрел сниферром - все тоже самое, только есть еще строка proxy-autorisation.
Причем везде HTTP 1.0
Куда дальше рыть... уже весь мозг сломал, уже второй день его доламываю....
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 20-11-2007 13:32 » 

kvv157, см.: в текстовом редакторе составляешь запрос с телом, копируешь его в буфер обмена. Потом запускаешь cmd.exe, а в нем - telnet IP PORT. После этого жмешь правой кнопкой на окно и выбираешь "стравить". Возвращенное с сервера будет распечатано в этом же окне.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
kvv157
Гость
« Ответ #8 : 20-11-2007 14:58 » 

kvv157, см.: в текстовом редакторе составляешь запрос с телом, копируешь его в буфер обмена. Потом запускаешь cmd.exe, а в нем - telnet IP PORT. После этого жмешь правой кнопкой на окно и выбираешь "стравить". Возвращенное с сервера будет распечатано в этом же окне.
В телнете РАБОТАТЕТ!!!
Причем туда я помещаю текст запроса, который моя прога в файл сбрасывает во время работы.
Причем работает и с HTTP 1.0 и с HTTP 1.1.
Я может уже совсем отупел, но если в телнете работает, то что это значит???!!!!
Какие выводы напрашиваются...

Пошел дальше эксперементировать:
В своей проге сделал подключение к прокси на 3128 (до этого пытался отправить запрос напрямую на сервер киберплата)
Теперь выдает точно такой же заголовок-ответ как и InetCrack, но тела все равно нет.
(Причем один раз телнет выдал так же только один заголовок)
« Последнее редактирование: 21-11-2007 07:48 от kvv157 » Записан
kvv157
Гость
« Ответ #9 : 22-11-2007 14:03 » new

У меня получилось  Улыбаюсь) Только пока не понял как  Здесь была моя ладья...
О результатах отпишусь!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines