2013-06-29 31 views
0

我有一个HTTP的Web代理服务器,其需要处理的请求,如...Web服务器URL - 检测PATHINFO层次

http://myserver.com/versions/2013.6.0.0/ML/Files/SomeFile.exe 

自身仅供参考承载的信息和具体的个人文件自动服务器软件更新(涉及许多单独的可更新文件)。

所以我创建的Web模块该请求处理程序,但这一要求的路径信息(Request.PathInfo)是...

/versions/2013.6.0.0/ML/Files/SomeFile.exe 

...但它需要检测只是第一部分...

/versions 

一旦检测到这一点,那么它需要处理下面的版本号...

/2013.6.0.0 

...在这种情况下,Web服务器知道客户端对该版本特定的请求数据。接下来的部分是应用程序版...

/ML 

然后我指定我正在寻找有关该版本/版本组合特定的文件...

/Files 

...最后实际的文件...

/SomeFile.exe 

此网址并不代表Web服务器上的任何实际目录 - 的SomeFile.exe实际位置可能是完全不同的(它是如何检测WH另一个故事找到这些文件)。

问题是,我应该如何检测此层次结构的Path Info并使用Web Module中提供的请求处理程序操作(TCollection)进行相应处理?由于内置的​​请求处理程序假定只有一个级别,但此服务器可能具有几乎无限的级别。

+2

检测?在路径中寻找多个斜线。处理?用斜杠分割查询,并根据结果做任何你想做的事情。困难在哪里?我相信我不明白这个问题。 –

回答

0

基于Rob对这个问题的评论,我很快意识到这是多么简单的事情。使用字符串列表,将路径信息分解成划分每个斜杠的不同列表项。然后,使用任何自定义机制来评估第一个,然后第二个,等等。每个变化将触发一个不同的处理程序的程序,像这样...

unit uUpdateServerWebModule; 

interface 

uses System.SysUtils, System.Classes, Web.HTTPApp, Update.Common; 

type 
    TWebModule1 = class(TWebModule) 
    procedure WebModule1DefaultHandlerAction(Sender: TObject; 
     Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); 
    private 
    procedure HandleVersionCheck(Request: TWebRequest; Response: TWebResponse; 
     PathInfo: TStringList); 
    procedure HandleInfoCheck(Request: TWebRequest; Response: TWebResponse; 
     PathInfo: TStringList); 
    procedure HandleException(Request: TWebRequest; Response: TWebResponse; 
     PathInfo: TStringList; const Code: Integer); 
    public 
    { Public declarations } 
    end; 

var 
    WebModuleClass: TComponentClass = TWebModule1; 

implementation 

{$R *.dfm} 

procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject; 
    Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); 
var 
    L: TStringList; 
    S, T: String; 
    P: Integer; 
    procedure A(const Text: String); 
    begin 
    S:= S + Text + sLineBreak; 
    end; 
begin 
    //Break down URL by slashes into list 
    L:= TStringList.Create; 
    try 
    S:= Request.PathInfo; 
    if Copy(S, Length(S)-1, 1) <> '/' then 
     S:= S + '/'; 
    Delete(S, 1, 1); 
    while Length(S) > 0 do begin 
     P:= Pos('/', S); 
     T:= Copy(S, 1, P-1); 
     Delete(S, 1, P); 
     L.Append(T); 
    end; 
    if L.Count > 0 then begin 
     //Handle path info list 
     if LowerCase(L[0]) = 'ver' then begin 
     HandleVersionCheck(Request, Response, L); 
     end else 
     if LowerCase(L[0]) = 'info' then begin 
     HandleInfoCheck(Request, Response, L); 
     end else begin 
     HandleException(Request, Response, L, 0); 
     end; 
    end else begin 
     //No page specified, return default page 
     Response.Content:= 'Application Update Server'; 
    end; 
    finally 
    L.Free; 
    end; 
end; 

procedure TWebModule1.HandleVersionCheck(Request: TWebRequest; 
    Response: TWebResponse; PathInfo: TStringList); 
var 
    EC: String; 
    FN: String; 
    Ver: TVersion; 
begin 
    if LowerCase(PathInfo[1]) = 'info' then begin 
    //Next parameter: Edition Code 
    EC:= LowerCase(PathInfo[2]); 
    if (EC = 'ml') or (EC = 'sl') or (EC = 'lt') then begin 
     //Return current version info for specified software edition... 
    end else begin 
     HandleException(Request, Response, PathInfo, 4); 
    end; 
    end else begin 
    //Next parameter: Version Number(s) 
    Ver:= TVersion.Create; 
    try 
     Ver.Version:= PathInfo[1]; 
     if (Ver.Ver1 > 0) and (Ver.Ver2 > 0) then begin 
     //Next parameter: Edition Code 
     EC:= LowerCase(PathInfo[2]); 
     if (EC = 'ml') or (EC = 'sl') or (EC = 'lt') then begin 
      //Next parameter: Version/Edition Commands 
      if LowerCase(PathInfo[3]) = 'update' then begin 
      //Return stream of full verion update installer app... 
      Response.ContentType:= 'application/octet-stream'; 

      end else 
      if LowerCase(PathInfo[3]) = 'files' then begin 
      //Next parameter: Specific filename 
      FN:= PathInfo[4]; 
      //Return stream of specific file... 
      Response.ContentType:= 'application/octet-stream'; 

      end else begin 
      HandleException(Request, Response, PathInfo, 1); 
      end; 
     end else begin 
      HandleException(Request, Response, PathInfo, 2); 
     end; 
     end else begin 
     HandleException(Request, Response, PathInfo, 3); 
     end; 
    finally 
     Ver.Free; 
    end; 
    end; 
end; 

procedure TWebModule1.HandleInfoCheck(Request: TWebRequest; 
    Response: TWebResponse; PathInfo: TStringList); 
begin 
    //Return information about all software and their current versions... 
end; 

procedure TWebModule1.HandleException(Request: TWebRequest; 
    Response: TWebResponse; PathInfo: TStringList; const Code: Integer); 
begin 
    //Return error information... 
    Response.Content:= 'EXCEPTION: '+IntToStr(Code); 
end; 

end. 

即是Web模块(主逻辑)

的主要的处理是从默认的处理程序完成的全部代码。基本上所有传入的请求都通过处理每个传入请求的此过程WebModule1DefaultHandlerAction进行处理。从这里开始,它首先确定是否有任何指定的路径。如果不是,它只会返回主目标网页。否则,它将首先读取列出的第一个路径,并根据请求的名称调用另一个处理程序。在这种情况下,它处理versions请求并进一步下载特定文件(SomeFile.exe)以保存在特定目标中。