123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- program simplehttpserver;
- {$mode objfpc}{$H+}
- {$define UseCThreads}
- uses
- {$IFDEF UNIX}{$IFDEF UseCThreads}
- cthreads,
- {$ENDIF}{$ENDIF}
- sysutils, Classes, fphttpserver, fpmimetypes, wmecho;
- Type
- { TTestHTTPServer }
- TTestHTTPServer = Class(TFPHTTPServer)
- private
- FBaseDir : String;
- FCount : Integer;
- FMimeLoaded : Boolean;
- FMimeTypesFile: String;
- procedure SetBaseDir(const AValue: String);
- Protected
- Procedure DoIdle(Sender : TObject);
- procedure CheckMimeLoaded;
- Property MimeLoaded : Boolean Read FMimeLoaded;
- public
- procedure HandleRequest(Var ARequest: TFPHTTPConnectionRequest;
- Var AResponse : TFPHTTPConnectionResponse); override;
- Property BaseDir : String Read FBaseDir Write SetBaseDir;
- Property MimeTypesFile : String Read FMimeTypesFile Write FMimeTypesFile;
- end;
- Var
- Serv : TTestHTTPServer;
- { TTestHTTPServer }
- procedure TTestHTTPServer.SetBaseDir(const AValue: String);
- begin
- if FBaseDir=AValue then exit;
- FBaseDir:=AValue;
- If (FBaseDir<>'') then
- FBaseDir:=IncludeTrailingPathDelimiter(FBaseDir);
- end;
- procedure TTestHTTPServer.DoIdle(Sender: TObject);
- begin
- Writeln('Idle, waiting for connections');
- end;
- procedure TTestHTTPServer.CheckMimeLoaded;
- begin
- If (Not MimeLoaded) and (MimeTypesFile<>'') then
- begin
- MimeTypes.LoadFromFile(MimeTypesFile);
- FMimeLoaded:=true;
- end;
- end;
- procedure TTestHTTPServer.HandleRequest(var ARequest: TFPHTTPConnectionRequest;
- var AResponse: TFPHTTPConnectionResponse);
- Var
- F : TFileStream;
- FN : String;
- begin
- FN:=ARequest.Url;
- If (length(FN)>0) and (FN[1]='/') then
- Delete(FN,1,1);
- DoDirSeparators(FN);
- FN:=BaseDir+FN;
- if FileExists(FN) then
- begin
- F:=TFileStream.Create(FN,fmOpenRead);
- try
- CheckMimeLoaded;
- AResponse.ContentType:=MimeTypes.GetMimeType(ExtractFileExt(FN));
- Writeln('Serving file: "',Fn,'". Reported Mime type: ',AResponse.ContentType);
- AResponse.ContentLength:=F.Size;
- AResponse.ContentStream:=F;
- AResponse.SendContent;
- AResponse.ContentStream:=Nil;
- finally
- F.Free;
- end;
- end
- else
- begin
- AResponse.Code:=404;
- AResponse.SendContent;
- end;
- Inc(FCount);
- If FCount>=5 then
- Active:=False;
- end;
- begin
- Serv:=TTestHTTPServer.Create(Nil);
- try
- Serv.BaseDir:=ExtractFilePath(ParamStr(0));
- {$ifdef unix}
- Serv.MimeTypesFile:='/etc/mime.types';
- {$endif}
- Serv.Threaded:=False;
- Serv.Port:=8080;
- Serv.AcceptIdleTimeout:=1000;
- Serv.OnAcceptIdle:[email protected];
- Serv.Active:=True;
- finally
- Serv.Free;
- end;
- end.
|