Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.03.2014, 09:57   #1
HaCTeHka_007
 
Регистрация: 06.03.2014
Сообщений: 5
По умолчанию 404 idhttpserver

Добрый день. Писала web-сервер по заданию к курсовику.. кое-как вроде работает, но не выходит указать действия при отсутствии файла на сервере..
надо чтоб при отсутствии файла сервер открывал файл 404.html.
я пробовала через исключение, но чёта не выходит.. и вот не пойму.. может не так написала или что-то другое надо?!..
текст программы:
Код:
unit web;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPServer, IdCustomHTTPServer,
  IdHTTPServer, StdCtrls, IdIPWatch;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    IdHTTPServer1: TIdHTTPServer;
    IdIPWatch1: TIdIPWatch;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure IdHTTPServer1CommandGet(AThread: TIdPeerThread;
      ARequestInfo: TIdHTTPRequestInfo;
      AResponseInfo: TIdHTTPResponseInfo);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}



procedure TForm1.Button1Click(Sender: TObject);
begin
   IdHTTPServer1.Active:=true;
  Memo1.Lines.Add(DateTimeToStr(Now)+': server started');
   Caption:=IdIPWatch1.LocalIP;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
    IdHTTPServer1.Active:=false;
  Memo1.Lines.Add(DateTimeToStr(Now)+': server stopped');
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
    Button2Click(Sender);
     Close;
end;

procedure TForm1.IdHTTPServer1CommandGet(AThread: TIdPeerThread;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
    Memo1.Lines.Add(arequestinfo.RemoteIP);
    Memo1.Lines.Add('---' + arequestinfo.RawHTTPCommand);

    if ARequestInfo.Document='/' then
   IdHTTPServer1.ServeFile(AThread,AResponseInfo,
   'C:\Users\HaCTeHka_007\Documents\www\index.html');
   if ARequestInfo.Document<>'/' then
   try
   IdHTTPServer1.ServeFile(AThread,AResponseInfo,
   'C:\Users\HaCTeHka_007\Documents\www'+ARequestInfo.Document);
    except
   on EFOpenError do begin
    IdHTTPServer1.ServeFile(AThread,AResponseInfo,
   'C:\Users\HaCTeHka_007\Documents\www\404.html');
   Memo1.Lines.Add(arequestinfo.RemoteIP);
   Memo1.Lines.Add('---' + arequestinfo.RawHTTPCommand);
   Memo1.Lines.Add('--- Error! file not found!');
   end;
   end;
   end;
  end.
страницу index открывает, при "/" тоже открывает index. с этим всё нормально как-бы, но вот когда ввожу отсутствующий файл- по идее он должен открыть мне файл 404... но он выдаёт
ошибку на строке
" IdHTTPServer1.ServeFile(AThread,ARe sponseInfo,
'C:\Users\HaCTeHka_007\Documents\ww w'+ARequestInfo.Document); "
ошибка: EFOpenError.
не может найти указанный мной файл и программа вылетает.
и я не знаю почему, я указала дальше действия в случае исключения...
кто может помочь?

Последний раз редактировалось Stilet; 06.03.2014 в 12:15.
HaCTeHka_007 вне форума Ответить с цитированием
Старый 06.03.2014, 12:25   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я бы примерно так делал:
Код:
procedure TForm1.IdHTTPServer1CommandGet(AThread: TIdPeerThread;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
const path='C:\Users\HaCTeHka_007\Documents\www\';
var f:string;
begin
    Memo1.Lines.Add(arequestinfo.RemoteIP);
    Memo1.Lines.Add('---' + arequestinfo.RawHTTPCommand);
  
   if ARequestInfo.Document='/' then begin
      IdHTTPServer1.ServeFile(AThread,AResponseInfo, path+'index.html');
   end else begin 
    f:=StringReplace(ARequestInfo.Document,'/'.'\',[rfreplaceall]);
    delete(f,1,1);
    if (f='\')or(not FileExists(path+f)) then  f:=path+'404.html';
    IdHTTPServer1.ServeFile(AThread,AResponseInfo,path+f)
  end;

end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.03.2014, 17:09   #3
HaCTeHka_007
 
Регистрация: 06.03.2014
Сообщений: 5
По умолчанию

Помогло. Спасибо большое
HaCTeHka_007 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi 7 idhttpServer и TMemoryStream stasones Работа с сетью в Delphi 3 01.07.2012 01:16
(IdHTTPServer + Timer) не запускается таймер по получению запроса на IdHTTPServer Jetro Работа с сетью в Delphi 4 11.05.2011 17:07
IdHttpServer Cookies postal2 Работа с сетью в Delphi 7 09.09.2009 15:23
вопрос по IdHTTPServer CraZZy RabbIt Работа с сетью в Delphi 2 24.07.2009 12:59
IdHTTPServer lukash Работа с сетью в Delphi 2 26.09.2007 02:26