Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Разобрать заголовок HTTP


Автор: LordGuest 30.1.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=email@mail.ru&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 в строке без кодирования в шестнадцатиричный формат?

Автор: LordGuest 31.1.2006, 06:30
Неужели ни у кого нет хотя бы примера таких функций? Наверняка и Borland что то может предложить, правда раскопать их коды тяжко очень smile

Автор: Romikgy 31.1.2006, 10:25
А самому разпарсить smile
Цитата(LordGuest @ 31.1.2006, 05:30 Найти цитируемый пост)

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

В папке Sources посмотри
Цитата(LordGuest @ 30.1.2006, 09:16 Найти цитируемый пост)

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

Все можно руками сделать (точнее программой написаной руками)

Автор: Snowy 31.1.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'];

и т.д.
А более детальное разделение только руками.

Автор: LordGuest 1.2.2006, 15:45
Спасибо конечно. Но необходимо сделать только на API без подключения модулей. В проекте может быть только модуль Windows и WinSock. А как все таки кодировать запрос GET/POST?

Автор: Snowy 1.2.2006, 17:00
Тогда только ручками построчно, анализируя каждую строку ответа.

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

Автор: Snowy 8.2.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

Автор: Демо 8.2.2006, 12:55
Цитата(LordGuest @ 8.2.2006, 13:14 Найти цитируемый пост)

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


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

Код

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;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)