Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2011.02.06;
Скачать: [xml.tar.bz2];

Вниз

Вопрос про разбор параметров запроса.   Найти похожие ветки 

 
vegarulez ©   (2009-02-02 11:33) [0]

Медвежонок Пятачок ©   (02.02.09 10:21) [12]
Спасибо. нашёл - отключил не знал про это.

так... ну вроде заработало...
теперь вопрос...

получая на сервере последовтельность переданных параметров, как её получить, оставиви её raw? Т.е. так как она пришла на сервер именно в том виде как она пришла.

т.е. для этого я использую ServerCommandGet + допустим memo1.
Если я делаю вот так:

memo1.Lines.Append("test");
memo1.Lines.Append(AResponseInfo.ResponseText);
memo1.Lines.Append(ARequestInfo.RawHeaders.Text);
memo1.Lines.Append(ARequestInfo.UnparsedParams);

то наверно уже получаю всё же распарсеный запрос... по параметрам.
или я не прав?


 
Медвежонок Пятачок ©   (2009-02-02 11:43) [1]

возьми tidtctserver.

В OnExecute в цикле делай ReadLn пока не прочитаешь пустую строку.
Это заголовок в чистом виде.
После цикла найди в нем "Content-Length: NNNN" и определи NNN.
После чего дополнительно считай в буфер NNN байт.

Заголовок + буфер - это и будет сырыми данными, которые отправляет браузер серверу.


 
vegarulez ©   (2009-02-03 08:36) [2]

Оки... пробую...

появилось несколько вопросов:
1.

begin
 connectionNumber:=0;
 AContext.Connection.IOHandler.WriteLn("Hello");
 connected:= true;
 while connected do
 begin
   try
    //while trim(AContext.Connection.IOHandler.ReadLn)<>"" do
     begin
      line:= AContext.Connection.IOHandler.ReadLn;
      AContext.Connection.IOHandler.WriteLn(">>"+line);
      memo1.Lines.add(format("[%d] %s",[connectionNumber,line]));
     end;
   finally
     connected:= false;
   end; { try/except }
 end;
end;


в первом случае при раскоментаренном while  получаю  вот такую последовательность:

[0] Connection: keep-alive
[0] Content-Length: 6
[0] Accept: text/html, */*
[0] User-Agent: Mozilla/3.0 (compatible; Indy Library)


при закоментаренном

[0] POST / HTTP/1.0
[0] Connection: keep-alive
[0] Content-Type: application/x-www-form-urlencoded
[0] Content-Length: 6
[0] Host: localhost:3000
[0] Accept: text/html, */*
[0] Accept-Encoding: identity
[0] User-Agent: Mozilla/3.0 (compatible; Indy Library)
[0]


если сравнить то получается все нечётные строки выкинуты... Почему?

2. Как прочесть N байт?

Нашёл вот такую реализацию... пробую...
var
 s: string;
 i: integer;
 buf: TIdBytes;
Begin
 connectionNumber:=0;
 AContext.Connection.IOHandler.WriteLn("Hello");
 connected:= true;
 while connected do
  try
   i := AContext.Connection.IOHandler.InputBuffer.Size;
   AContext.Connection.IOHandler.ReadBytes(buf, i);
   s := BytesToString(buf, i);
  finally
   connected:= false;
  end; { try }
End;


но почему то i равно 0, или задать i выкусив значение из Content-Length предварительно прогнав код из части 1.?
Но тогда как их склеить... т.е. я имею ввиду ReadLn с части 1. же уже прочтёт часть данных, если потом ещё байты считывать заголовок же продублируется? или нет? Или считываение побайтно начнётся с того места где readLn остановился?


 
Сергей М. ©   (2009-02-03 09:38) [3]


> использую ServerCommandGet + допустим memo1


TMemo в данной ситуации использовать недопустимо, ибо обработчик OnCommandGet выполняется в контексте доп.треда, в то время как TMemo является визуальным VCL-контролом.


 
vegarulez ©   (2009-02-03 09:42) [4]

Сергей М. ©   (03.02.09 09:38) [3]
ок создам, Tsringlist в него всё скину, только как потом всё же в мемо его пометить? синхронизацию делать?(это же всё же основной поток вроде как)

а по поводу vegarulez ©   (03.02.09 08:36) [2]?


 
Сергей М. ©   (2009-02-03 09:48) [5]


> синхронизацию делать?


Ну а как же без нее ?


> по поводу vegarulez ©   (03.02.09 08:36) [2]?


Не вникал.


 
Медвежонок Пятачок ©   (2009-02-03 10:08) [6]


begin
connectionNumber:=0;
AContext.Connection.IOHandler.WriteLn("Hello");
connected:= true;
while connected do
begin
  try
   //while trim(AContext.Connection.IOHandler.ReadLn)<>"" do
    begin
     line:= AContext.Connection.IOHandler.ReadLn;
     AContext.Connection.IOHandler.WriteLn(">>"+line);
     memo1.Lines.add(format("[%d] %s",[connectionNumber,line]));
    end;
  finally
    connected:= false;
  end; { try/except }
end;
end;


Откуда такие вольности при реализации http протокола?
Откуда все эти hello?
Зачем все эти WriteLn(">>"+line);?

тебе всего-то требовалось войти в цикл repeat/until и делать в нем readln
пока не прочитаешь пустую строку.
затем дополнительно прочитать буфер длиной Content-length


 
vegarulez ©   (2009-02-03 10:58) [7]

Медвежонок Пятачок ©   (03.02.09 10:08) [6]
ну так это же не http протокол это тестовая программа для того чтобы посомтреть чтоже всё же передаёт клиент. Hello было просто введено для того чтобы посомтреть приходить ли что-нибудь на tidtcpserver когда я его взял для тестирования.

так вот смотри, я поставил там цикл на чтение пока до пустой строки не дойдёт.
в vegarulez ©   (03.02.09 08:36) [2] в пункте 1. написал что из этого получается. когда он до неё доходит - повисает т.е. там надо буфер длинной Content-length читать... как это сделать я не знаю - ищу. Подскажи.


 
Медвежонок Пятачок ©   (2009-02-03 11:42) [8]

ты бы еще сэмулировал протокол торрента для того, чтобы посмотреть, что же браузер отправляет веб-серверу

где логика-то?

Подскажи.

Два раза уже подсказал как посмотреть то, что браузер шлет серверу.


 
Медвежонок Пятачок ©   (2009-02-03 12:04) [9]

т.е. там надо буфер длинной Content-length читать... как это сделать я не знаю - ищу. Подскажи.

если уверен, что там нет нулевых символов, можно просто читать а строку.
в противном случае TIdBytes
+ idGlobal.pas и функции ToBytesXXX и BytesToXXX


 
vegarulez ©   (2009-02-03 15:13) [10]

Ок спасибо - попробую, сечас посмотрю про эти функции.

просто читать как строку не получается как доходит до туда - вываливается.

    begin
     line:= AContext.Connection.IOHandler.ReadLn;
     AContext.Connection.IOHandler.WriteLn(">>"+line);
     memo1.Lines.add(format("[%d] %s",[connectionNumber,line]));
    end;

с таким кодом
получаю

[0] POST / HTTP/1.0
[0] Connection: keep-alive
[0] Content-Type: application/x-www-form-urlencoded
[0] Content-Length: 6
[0] Host: localhost:3000
[0] Accept: text/html, */*
[0] Accept-Encoding: identity
[0] User-Agent: Mozilla/3.0 (compatible; Indy Library)
[0]


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


 
Медвежонок Пятачок ©   (2009-02-03 17:26) [11]

var cStr : string; Buff : TBytes; nContentLength : integer;
begin
repeat
 cStr := AContext.Connection.Socket.ReadLn;
until cStr = "";
...
AContext.Connection.Socket.ReadBytes(Buff,nContentLength);
end;


 
vegarulez ©   (2009-02-04 10:39) [12]

ок. сделал. посмотрел всё что хотел увидеть.
Теперь собственно возращаемся к изначальному вопросу.
Клиент передаёт с помощью idHttp заголовок и тело сообщения, посмотрев на тестовой программе заголовки и тело - я понял, что авторизация не происходит потому, что в заголовке отсуствуют параметры для авторизации на сервере, хотя idHttp при отправке получает эти параметры

var
HTTP: TidHttp;
begin
...
   HTTP.Request.Username := Edit_Login.Text;
   HTTP.Request.Password := Edit_Password.Text;
   HTTP.Post(cbURL.Text, memo1.Lines, Response);
...
end;


соответсвенно должен их передать...и принять.
А на тестовой программе, а idhttp разбирая запрос в парметрах

ARequestInfo.AuthUsername
ARequestInfo.AuthPassword


пустые строки. В чём может быть дело?


 
vegarulez ©   (2009-02-04 10:41) [13]

опечатался....

А на тестовой программе, idhttpSERVER разбирая запрос в параметрах

ARequestInfo.AuthUsername
ARequestInfo.AuthPassword


видит пустые строки. В чём может быть дело?


 
Медвежонок Пятачок ©   (2009-02-04 10:55) [14]

Username is a String property used in conjunction with Password to construct authorization credentials during Authentiction of HTTP connection. Username and Password are suppied to the TIdAuthentication class instance in Authentication,
when BasicAuthentication is True,
in the SetHeaders method.


 
vegarulez ©   (2009-02-04 12:53) [15]

Спасибо!!
BasicAuthentication is True
Помогло. Появились логин и пароль.
Сечас потестирую.



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2011.02.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.004 c
11-1229077921
sir tictactoe
2008-12-12 13:32
2011.02.06
не получается создать MCK-проект в BDS2006


2-1290114890
Василий3
2010-11-19 00:14
2011.02.06
веб браузер с проксей


15-1288009676
Alx2
2010-10-25 16:27
2011.02.06
Перепись. Последний день.


6-1234078143
FireMan_Alexey
2009-02-08 10:29
2011.02.06
ограничение скорости


4-1245172423
Дмитрий
2009-06-16 21:13
2011.02.06
Как создать консольную форму





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский