Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разобрать заголовок HTTP 
:(
    Опции темы
LordGuest
Дата 30.1.2006, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.1.2006

Репутация: нет
Всего: нет



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 в строке без кодирования в шестнадцатиричный формат?
PM MAIL   Вверх
LordGuest
Дата 31.1.2006, 06:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.1.2006

Репутация: нет
Всего: нет



Неужели ни у кого нет хотя бы примера таких функций? Наверняка и Borland что то может предложить, правда раскопать их коды тяжко очень smile
PM MAIL   Вверх
Romikgy
Дата 31.1.2006, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



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

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

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

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

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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Snowy
Дата 31.1.2006, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Нет конечно. Все только ручками.
Можно упростить задачу.
Записать ответ в 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'];

и т.д.
А более детальное разделение только руками.
PM MAIL   Вверх
LordGuest
Дата 1.2.2006, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.1.2006

Репутация: нет
Всего: нет



Спасибо конечно. Но необходимо сделать только на API без подключения модулей. В проекте может быть только модуль Windows и WinSock. А как все таки кодировать запрос GET/POST?
PM MAIL   Вверх
Snowy
Дата 1.2.2006, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Тогда только ручками построчно, анализируя каждую строку ответа.
PM MAIL   Вверх
LordGuest
Дата 8.2.2006, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.1.2006

Репутация: нет
Всего: нет



Блин, хоть убейте... не могу понять как это делается... может быть кто-нибудь код настрочит? Как строку параметров преобразовать в принятый шестнадцатиричный формат и обратно раскодировать его?
PM MAIL   Вверх
Snowy
Дата 8.2.2006, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Код
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
PM MAIL   Вверх
Демо
Дата 8.2.2006, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 3
Всего: 50



Цитата(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;




--------------------
    
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0552 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.