информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медСетевые кракеры и правда о деле ЛевинаSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
во-первых, InternetOpenUrl работает через GET 20.09.07 13:33  Число просмотров: 2539
Автор: dl <Dmitry Leonov>
<"чистая" ссылка> <обсуждение закрыто>
[moved from networking]
Для POST нужно использовать InternetConnect, HttpOpenRequest, HttpSendRequest.

Во-вторых, даже если бы тут работал POST, то с чего вдруг переменным из заголовка на стороне сервера попадать в $_POST, куда должны складываться переменные, извлеченные из тела запроса.
<programming>
Не могу получить данные через POST 20.09.07 08:25   [ZloyShaman, dl]
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
Делаю следующую вещь. Программа под Windows на C++ устанавливает соединение с сервером, обращается к URL передавая ему данные через заголовок:

…
wsprintf(szURL, "http://www.indigo.ringingcedarsofrussia.org/veche/login.php");
wsprintf(szHeader, "l:%s\np:%s", szLogin, szPassw);
…
hURL = InternetOpenUrl(hInternetSession, lpcszURL, lpcszHeader, lstrlen(lpcszHeader), 0, 0);
…

---

Данные в заголовке успешно доходят до сервера. Там я их обрабатываю PHP-скриптом (параметры присутствуют в массиве, возвращаемом функцией GetAllHeaders):

$headers = GetAllHeaders();
echo “$headers['l']<br>$headers['p']”;

---

Но вот через переменную $_POST к этим данным я обратиться не могу. В чём причина?
во-первых, InternetOpenUrl работает через GET 20.09.07 13:33  
Автор: dl <Dmitry Leonov>
<"чистая" ссылка> <обсуждение закрыто>
[moved from networking]
Для POST нужно использовать InternetConnect, HttpOpenRequest, HttpSendRequest.

Во-вторых, даже если бы тут работал POST, то с чего вдруг переменным из заголовка на стороне сервера попадать в $_POST, куда должны складываться переменные, извлеченные из тела запроса.
Насколько мне известно, данные, передаваемые методом POST... 21.09.07 04:49  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
Отредактировано 21.09.07 04:53  Количество правок: 2
<"чистая" ссылка> <обсуждение закрыто>
[moved from networking]
Насколько мне известно, данные, передаваемые методом POST для сервера «пустой звук» (он их никак не интерпретирует – так говорит Д. Котеров «Самоучитель PHP» стр.35), поэтому PHP, получив заголовок, должен его разобрать и сформировать переменную $_POST. Чтобы это сделать, интерпретатор читает длину заголовка из переменной “Content-Length”.

Переписал код с Вашими рекомендациями:
	DWORD dwBytesRead;
	char sz[255];

	HINTERNET hInternet = InternetOpen("Test", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
	HINTERNET hConnect = InternetConnect(hInternet, "www.indigo.ringingcedarsofrussia.org",
			INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1u);
	HINTERNET hRequest = HttpOpenRequest(hConnect, "POST", "veche//login.php", NULL, NULL,
			0, INTERNET_FLAG_KEEP_CONNECTION, 1);
	BOOL bSend = HttpSendRequest(hRequest, "l:VedaCoder@mail.ru\np:123456",-1, NULL,0);
	InternetReadFile(hRequest, sz, 255, &dwBytesRead);

---

Вот, что получает сервер (читаю headers функцией InternetReadFile):
[Cache-Control] => no-cache
[Connection] => Keep-Alive
[Content-Length] => 0
[Host] => www.indigo.ringingcedarsofrussia.org
[l] => VedaCoder@mail.ru
[p] => 123456
[User-Agent] => Test

---

Наверное, проблема в том, что Content-Length = 0. Где у меня опять прокол?
заголовки не относятся к телу запроса 21.09.07 05:03  
Автор: dl <Dmitry Leonov>
<"чистая" ссылка> <обсуждение закрыто>
[moved from networking]
Заголовки, разделенные переводом строки, сами по себе, запрос сам по себе. Идет он сразу после заголовков, отделенным еще одним переводом строки. В Content-Length лежит длина запроса (и его надо формировать самостоятельно). Отдельные параметры запроса разделяются не переводом строки, а &, каждый параметр - как имя=значение.
т.е. передавать надо что-то типа
"Content-Length=30\n\nl=VedaCoder@mail.ru&p=123456"
Нелатиницу при этом лучше превращать в вид %XX.
В MSDN сказано, что HttpSendRequest вторым параметром... 21.09.07 05:42  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
Отредактировано 21.09.07 06:30  Количество правок: 3
<"чистая" ссылка> <обсуждение закрыто>
[moved from networking]
В MSDN сказано, что HttpSendRequest вторым параметром принимает header, а третьим его размер. Если этот размер выставить в -1, то он будет рассчитан автоматически.

Когда я добавляют строку “Content-Length” в начало своего заголовка (“Content-Length:29\n\nl:VedaCoder@mail.ru&p:123456”) функция HttpSendRequest виснет (выхода из неё в отладчике я так и не дождался).

Пардон, в HttpSendRequest я не туда свои данные передал. Их нужно в 4 и 5 параметр. Но это не помогло. Content-Length теперь не нулевая, но в _POST данных по прежнему нету:

BOOL bSend = HttpSendRequest(hRequest, NULL, 0, "l=VedaCoder@mail.ru&p=123456",29);

ЗЫ. Спасибо за быстрый ответ.
реально, конечно, нужно не 29, а sizeof(строки) 21.09.07 13:33  
Автор: dl <Dmitry Leonov>
<"чистая" ссылка> <обсуждение закрыто>
[moved from networking]
Для контроля на стороне сервера стоит распечатать, что ему при этом приходит на stdin.
Ну и полезно указать среди заголовков Content-type: application/x-www-form-urlencoded
dl, спасибо. Проблема была в том, что не указывал... 21.09.07 13:46  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
[moved from networking]
dl, спасибо. Проблема была в том, что не указывал "Content-Type:application/x-www-form-urlencoded". Вот рабочий код:

DWORD dwBytesRead;
char sz[255];

HINTERNET hInternet = InternetOpen("Test", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET hConnect = InternetConnect(hInternet, "indigo.ringingcedarsofrussia.org",
INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1u);
HINTERNET hRequest = HttpOpenRequest(hConnect, "POST", "veche/login.php", HTTP_VERSION, "localhost", 
0, INTERNET_FLAG_KEEP_CONNECTION, 1);
BOOL bSend = HttpSendRequest(hRequest, "Content-Type:application/x-www-form-urlencoded", -1, "l=VedaCoder@mail.ru&p=123456",28);

InternetReadFile(hRequest, sz, 255, &dwBytesRead);

---

Может быть есть ещё какие-нибудь параметры в заголовке, которые также желательно указать, чтобы не возникало проблем?
этих достаточно 21.09.07 13:52  
Автор: dl <Dmitry Leonov>
<"чистая" ссылка> <обсуждение закрыто>
[moved from networking]
Размер и тип передаваемых данных, остальное опционально - referer, user-agent, authorization, куки и т.п.

Разве что в зависимости от хостинга может потребоваться указание заголовка Host, чтобы взаимодействовать с одним из виртуальных серверов, лежащих на одном IP (хотя есть шанс ,что WinINet и его может формировать самостоятельно).
Большое спасибо. Тема закрыта 21.09.07 15:52  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
[moved from networking]
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach