Разобрать заголовок HTTP

 
0
 
Delphi, Kylix and Pascal
ava
LordGuest | 30.01.2006, 10:16
1. Есть некоторый заголовок

POST /addurl.cgi HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, */*
Accept-Language: ru
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: localhost:25686
Content-Length: 157
Connection: Keep-Alive
Cache-Control: no-cache

title=Page+title&note=Page+Description&class=Internet&url=http://testing.ru&fname=First+Name&lname=Last+Name&[email protected]&country=United+
Kingdom

Необходимо заполнить структуру на основе этого заголовка следующим образом:

Info.Method = 'POST'
Info.Path = '/addurl.cgi'
Info.HTTP_VER = 'HTTP/1.1'
Info.Accept = 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, */*'
Info.Accept_Language = 'ru'
Info.Content_Type = 'application/x-www-form-urlencoded'
Info.User_Agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)'
Info.Host = 'localhost:25686'
Info.Connetion_Length = '157'
Info.Connection = 'Keep-Alive'
Info.Cache_Control = 'no-cache'

Info.Title = 'Page+title'
Info.Note = 'Page+Description'
Info.Class = 'Internet'
Info.Url = 'http://testing.ru'
Info.FName = 'First+Name'
...
Info.Country = 'United+Kingdom'

2. И еще. Есть ли какие-нибудь функции для кодирования и декодирования строки параметров? Ведь русские и некоторые символы невозможно передавать методом GET в строке без кодирования в шестнадцатиричный формат?
Ответы (8)
ava
LordGuest | 31.01.2006, 06:30 #
Неужели ни у кого нет хотя бы примера таких функций? Наверняка и Borland что то может предложить, правда раскопать их коды тяжко очень :(
ava
Romikgy | 31.01.2006, 10:25 #
А самому разпарсить smile
Цитата (LordGuest @ 31.1.2006, 05:30 findReferencedText)


Наверняка и Borland что то может предложить, правда раскопать их коды тяжко очень


В папке Sources посмотри
Цитата (LordGuest @ 30.1.2006, 09:16 findReferencedText)


И еще. Есть ли какие-нибудь функции для кодирования и декодирования строки параметров? Ведь русские и некоторые символы невозможно передавать методом GET в строке без кодирования в шестнадцатиричный формат


Все можно руками сделать (точнее программой написаной руками)
ava
Snowy | 31.01.2006, 10:28 #
Нет конечно. Все только ручками.
Можно упростить задачу.
Записать ответ в TStringList.
установить у него NameValueSeparator = ':';
после этого можешь считывать параметры по имени:

sl: TStringList.Create;
sl.NameValueSeparator := ':';
sl.LoadFromStream(ms); // ms: TMemoryStream - здесь ответ на запрос
Info.Accept := sl.Values['Accept'];
Info.Accept_Language := sl.Values['Accept-Language'];
Info.Content_Type := sl.Values['Content-Type'];

и т.д.
А более детальное разделение только руками.
ava
LordGuest | 01.02.2006, 15:45 #
Спасибо конечно. Но необходимо сделать только на API без подключения модулей. В проекте может быть только модуль Windows и WinSock. А как все таки кодировать запрос GET/POST?
ava
Snowy | 01.02.2006, 17:00 #
Тогда только ручками построчно, анализируя каждую строку ответа.
ava
LordGuest | 08.02.2006, 12:14 #
Блин, хоть убейте... не могу понять как это делается... может быть кто-нибудь код настрочит? Как строку параметров преобразовать в принятый шестнадцатиричный формат и обратно раскодировать его?
ava
Snowy | 08.02.2006, 12:36 #
function Encode(s:string):string;
var
i: integer;
begin
result:='';
for i:=1 to Length(s) do
if (s[i] in ['A'..'z']) or (s[i] in ['-'..'0']) then result:=result+s[i]
else result:=result + '%' + IntToHex(ord(s[i]),2);
end;

Также есть готовые кодилки/декодилки в Indy
ava
Демо | 08.02.2006, 12:55 #
Цитата (LordGuest @ 8.2.2006, 13:14 findReferencedText)


Блин, хоть убейте... не могу понять как это делается... может быть кто-нибудь код настрочит? Как строку параметров преобразовать в принятый шестнадцатиричный формат и обратно раскодировать его?



Из какого-то совсем древнего проекта:


function Decode(Value: String):String;
var
i,L: Integer;
begin
Result := '';
L := 0;
for i := 1 to Length(Value) do
begin
if (Value[i]<>'%') and (Value[i]<>'+') and (L<1) then
begin
Result := Result + Value[i];
end
else
begin
if Value[i]='+' then Result := Result+' '
else if Value[i]='%' then
begin
L := 2;
if (i<Length(Value)-1) then
begin
Result := Result + Chr(StrToInt('$'+Copy(Value,i+1,2)));
end;
end
else Dec(L);
end;
end;
end;




function Encode1(const Src: String): String;
const
A:array[0..15] of char='0123456789ABCDEF';
var
i: Integer;
index,LenSrc: Integer;
begin
Result :='';
if Src='' then Exit;
Index := 0;
LenSrc := Length(Src);
SetLength(Result,LenSrc*3+1);
FillChar(Result[1],LenSrc*3,'%');
for i := 1 to LenSrc do
begin
case Src[i] of
'a'..'z','A'..'Z','0'..'9','/','.':
begin
Inc(Index);
Result[Index] := Src[i];
end;
else
begin
Result[Index+2] := A[(byte(Src[i]) and $F0) shr 4];
Result[Index+3] := A[byte(Src[i]) and $0F];
Inc(Index,3);
end;
end;
end;
SetLength(Result,Index);
end;

Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить