Текущий архив: 2011.02.06;
Скачать: CL | DM;
ВнизВопрос про разбор параметров запроса. Найти похожие ветки
← →
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;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.003 c