Тема: IdHTTPServer
Показать сообщение отдельно
  #2  
Старый 28.08.2009, 21:40
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Лично я сделал так:
Код:
procedure TwndMain.ServerCommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
    aFilename: string;
    DataStream:TMemoryStream;

    function NormalFileName(fName:string):string;
    var s:string;
    begin
      s := WorkPath + fName;
      s := StringReplace(s,'/','\',[rfReplaceAll]);
      Result := s;
    end;
begin
  _requests := _requests+(Format('Client %s:%d trying to "%s" request on "%s" document at %s',[
                          AContext.Binding.PeerIP,
                          AContext.Binding.PeerPort,
                          ARequestInfo.Command,
                          ARequestInfo.Document,
                          FormatDateTime('yyyy/mm/dd hh:mm:ss', Now)]))+#13#10; //для ведения журнала
  if ARequestInfo.Command <> 'GET' then
  begin
    _messages := _messages+(Format('Client %s:%d used "%s" request at %s',[
                          AContext.Binding.PeerIP,
                          AContext.Binding.PeerPort,
                          ARequestInfo.Command,
                          FormatDateTime('yyyy/mm/dd hh:mm:ss', Now)]))+#13#10;// для ведения журнала
    AResponseInfo.ResponseNo := 501; // 501 ошибка
    aFilename := NormalFileName('/501.htm');
    AResponseInfo.ContentType := GenContType(aFilename);
    AResponseInfo.ContentStream := TFileStream.Create(aFileName,fmShareDenyNone);
    Exit;
  end;
  if ARequestInfo.Document = '/' then
    ARequestInfo.Document := ARequestInfo.Document + 'index.htm';
  aFilename := NormalFileName(ARequestInfo.Document);
  if FileExists(aFilename) then
  begin
    AResponseInfo.ContentType := GenContType(aFilename); // определяет тип содержимого по расширению запрашиваемого файла *.htm == text/html *.txt == text/plain ну и так далее
    AResponseInfo.ResponseNo := 200;// все успешно
    AResponseInfo.ContentStream := TFileStream.Create(aFileName,fmShareDenyNone);
    Exit;
  end;
  _messages := _messages+(Format('Client %s:%d trying to get nonexistent file "%s" at %s',[
                          AContext.Binding.PeerIP,
                          AContext.Binding.PeerPort,
                          ARequestInfo.Document,
                          FormatDateTime('yyyy/mm/dd hh:mm:ss', Now)]))+#13#10;
  aFilename := NormalFileName('/404.htm');//выдаем 404 ошибку
  AResponseInfo.ContentType := GenContType(aFilename);
  AResponseInfo.ResponseNo := 404;
  AResponseInfo.ContentStream := TFileStream.Create(aFileName,fmShareDenyNone);
end;
добавлено 10нс спустя.
Чуть не забыл, иконка передастся автоматом, у меня работает, пробовал на опере, файрфоксе.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием