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


Автор: vood 11.3.2006, 06:54
В Idhttpserver можно обрабатывать запросы("www.sss.rrr/?as=as"), но через событие OnCommandGet это не удобно.
есть ли другой способ их обработки?
и еще есть ли другой способ передачи ответа на запрос, кроме AREquestinfo.ContentText?

Автор: Prof_2000 11.3.2006, 14:36
К сожалению у самого Idhttpserver таких функциональностей нет, разве что через голые сокеты(еще менее удобно). Но можешь работать с ICS компонентами. Там и настройка более проста, и ответ на запрос чрезвычайно легко организуется...

Автор: vood 11.3.2006, 15:46
А где мне их скачать??

Автор: vood 13.3.2006, 10:52
Кстати как в Idhttpserver передать вместо текста файл?

Автор: Snowy 13.3.2006, 11:05
Точно также. Только mime type указать другой.
Щас в закромах пример гляну...
Добавлено @ 11:09
Вот пример простенького http сервера:
Код
unit httpserver;

interface

uses SysUtils, Classes, IdHTTPServer, IdCustomHTTPServer, IdTCPServer;

type
  THTTPServer = class
  private
    FPort:   integer;
    FActive: boolean;
    http:    TIdHTTPServer;
    procedure State(activ: boolean);
    procedure SetPort(port: integer);
    procedure OnGet(AThread: TIdPeerThread;
              ARequestInfo: TIdHTTPRequestInfo;
              AResponseInfo: TIdHTTPResponseInfo);
  public
    constructor Create;
    destructor Destroy; override;
    procedure StartServer;
    procedure StopServer;
  published
    property Active: boolean read FActive write State;
    property Port: integer read FPort write SetPort;

  end;


implementation

procedure THTTPServer.StartServer;
begin
  http.DefaultPort:=FPort;
  try
    http.Active:=true;
    FActive:=true;
  except
    FActive:=false;
  end;
end;

procedure THTTPServer.StopServer;
begin
  http.Active:=false;
end;

procedure THTTPServer.State;
begin
  if activ then
    if not Active then StartServer;
  if not activ then
    if Active then StopServer;
end;

procedure THTTPServer.SetPort;
begin
  FPort:=port;
  if Active then begin
    StopServer;
    StartServer;
  end;
end;

constructor THTTPServer.Create;
begin
  Port:=80;
  Active:=false;
  http:=TIdHTTPServer.Create(nil);
  http.ServerSoftware:='Snowy HTTP Server';
  http.OnCommandGet:=OnGet;
end;

destructor THTTPServer.Destroy;
begin
  http.Free;
end;

procedure THTTPServer.OnGet(AThread: TIdPeerThread;
          ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
  s: string;
  fs: TFileStream;
begin
  s:='.'+ARequestInfo.Document;
  fs:=nil;
  try
    try
      fs:=TFileStream.Create(s,$40);
      SetLength(s,fs.size); fs.Read(s[1],fs.Size);
      AResponseInfo.ContentText:=s;
      AResponseInfo.ContentType:=http.MIMETable.GetDefaultFileExt(s);
    except
      AResponseInfo.ResponseNo:=404;
    end;
  finally
    fs.Free;
  end;
end;

end.

Добавлено @ 11:10
Набросал на скорую руку.
Нужно было еще параметр для домашнего каталога сделать.
Вот тут:
Код
  s:='.'+ARequestInfo.Document;
вместо точки нужно поставить домашний каталог.

Автор: vood 15.3.2006, 11:08
Snowy, спасибо за пример.
Тут накопились вопросы:
1.Как выглядит http-ответ Idhttpserver-а (пожалуйста покажите место где там AREquestinfo.ContentText)?
2.Почему если Idhttpserver сделать команд хендлер ' GET' он через него не будет обрабатывать запросы?
3.У сессий Idhttpserver тоже есть ContentText но до меня не доходить как сессиями пользоваться.
Так вот вопрос: Как использовать сессии в ответе на запрос?

Автор: vood 16.3.2006, 11:36
Кстати домашний каталог ружно задать как 'D:\Films' или нет?

Автор: Snowy 16.3.2006, 11:45
Цитата(vood @ 16.3.2006, 11:36 Найти цитируемый пост)
Кстати домашний каталог ружно задать как 'D:\Films' или нет?
Можно поэксперементировать.
Но лучше будет задавать, как "/Films"

Автор: vood 16.3.2006, 11:47
То есть каталог сервера
Добавлено @ 11:51
Я имею ввиду ,что тот каталог к которому открыт доступ или он являеться корневым сервера нужно указывать ,а не любой на серваке

Автор: Snowy 16.3.2006, 12:29
/Films и будет корневым для текущего диска.
Для другого диска будет "E:/Films"

Автор: vood 17.3.2006, 10:55
У сессий Idhttpserver тоже есть ContentText но до меня не доходить как сессиями пользоваться.
Так вот вопрос: Как использовать сессии в ответе на запрос?

Автор: vood 17.3.2006, 11:21
Кстати,Snowy в твоем коде ты забыл сделать AResponseInfo.WriteContent

Автор: Snowy 17.3.2006, 11:58
Ничего я не забыл. Код полностью рабочий.

Автор: vood 17.3.2006, 12:01
Но без записи контента он не проканает
Добавлено @ 12:02
А без этого код выдавал в IE 404
Добавлено @ 12:07
Как выглядит ответ IdHttpServer на запрос (что он посылает в браузер, какой текст)?

Автор: Snowy 17.3.2006, 12:21
Вот от - контент.
Цитата(Snowy @ 13.3.2006, 11:05 Найти цитируемый пост)
AResponseInfo.ContentText:=s;



Цитата(vood @ 17.3.2006, 12:01 Найти цитируемый пост)
Как выглядит ответ IdHttpServer на запрос (что он посылает в браузер, какой текст)?

Пример гугля:
Цитата
HTTP/1.1 200 OK
Via: 1.0 KM-PROXY3
Content-Length: 1653
Date: Fri, 17 Mar 2006 09:20:13 GMT
Content-Type: text/html
Cache-Control: private
Content-Encoding: gzip
Server: GWS/2.1

Ниже пустая строка. Ниже контент в соответствующем формате.

Автор: vood 17.3.2006, 12:24
то есть хтмл-код

Автор: Snowy 17.3.2006, 12:32
В контенте может быть не только html.
html - любая страница. Возьми любую страницу - это и будет пример.

Автор: vood 18.3.2006, 08:49
Пасибо, Snowy!

Автор: vood 18.3.2006, 09:18
кстати, из какой папки берет картинки страничка сгенерированная через ContentText(я имею ввиду случаи использования тега img вот так: <img src="Pict.jpg">)?

Автор: Ground 19.3.2006, 12:11
Всмысле без указания каталога картинки?!
Если так, то картинка берется из папки с HTML - страницой.

Автор: vood 20.3.2006, 11:52
А если сгенерирован html-код?
Добавлено @ 11:57
Или код записан в поток соединения?
Добавлено @ 11:57
Из обьекта Threads

Автор: vood 20.3.2006, 12:24
да еще какое свойство idhttpserver показывает кол-во соединений?

Автор: Snowy 20.3.2006, 12:39
Цитата(vood @ 20.3.2006, 11:52 Найти цитируемый пост)
А если сгенерирован html-код?
Из папки, которая является в данный момент текущей (GetCurrentDir, SetCurrentDir)


Цитата(vood @ 20.3.2006, 12:24 Найти цитируемый пост)
да еще какое свойство idhttpserver показывает кол-во соединений?
IdHttpServer1.Threads.LockList.Count;

Модератор: Пожалуйста, один топик - один вопрос.

Автор: vood 21.3.2006, 02:12
У меня это свойство вешает сервер
Есть другое?

Автор: Snowy 21.3.2006, 11:13
Просто после этого нужно сделать UnLock

Автор: vood 22.3.2006, 09:53
Спасибо, больше вопросов нет!

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