home *** CD-ROM | disk | FTP | other *** search
/ Chip 1997 October / CD CHIP.ISO / WebServ / server7 / MapURL.dpr < prev    next >
Encoding:
Text File  |  1996-10-13  |  9.9 KB  |  249 lines

  1. Library MapURL;
  2.  
  3. // Header conversion by Stephen Genusa <steveg@onramp.net> 06/08/96. Thanks!!! MWT
  4.  
  5. Uses
  6.   SysUtils, Windows, Parser;
  7.  
  8. const
  9.     HTTP_FILTER_MAJOR          = 1; { major version of this spec }
  10.     HTTP_FILTER_MINOR          = 0; { minor version of this spec }
  11.     SF_MAX_USERNAME            = 257;
  12.     SF_MAX_PASSWORD            = 257;
  13.     SF_MAX_FILTER_DESC_LEN     = 257;
  14.  
  15.     // SF_STATUS_TYPE
  16.     SF_STATUS_TYPE                     = $8000000;  { base value }
  17.     SF_STATUS_REQ_FINISHED             = SF_STATUS_TYPE;
  18.     SF_STATUS_REQ_FINISHED_KEEP_CONN   = SF_STATUS_TYPE + 1;
  19.     SF_STATUS_REQ_NEXT_NOTIFICATION    = SF_STATUS_TYPE + 2;
  20.     SF_STATUS_REQ_HANDLED_NOTIFICATION = SF_STATUS_TYPE + 3;
  21.     SF_STATUS_REQ_ERROR                = SF_STATUS_TYPE + 4;
  22.     SF_STATUS_REQ_READ_NEXT            = SF_STATUS_TYPE + 5;
  23.     SF_NOTIFY_SECURE_PORT              = $00000001;
  24.     SF_NOTIFY_NONSECURE_PORT           = $00000002;
  25.     SF_NOTIFY_READ_RAW_DATA            = $00008000;
  26.     SF_NOTIFY_PREPROC_HEADERS          = $00004000;
  27.     SF_NOTIFY_AUTHENTICATION           = $00002000;
  28.     SF_NOTIFY_URL_MAP                  = $00001000;
  29.     SF_NOTIFY_SEND_RAW_DATA            = $00000400;
  30.     SF_NOTIFY_LOG                      = $00000200;
  31.     SF_NOTIFY_END_OF_NET_SESSION       = $00000100;
  32.     SF_NOTIFY_ORDER_HIGH               = $00080000;
  33.     SF_NOTIFY_ORDER_MEDIUM             = $00040000;
  34.     SF_NOTIFY_ORDER_LOW                = $00020000;
  35.     SF_NOTIFY_ORDER_DEFAULT            = SF_NOTIFY_ORDER_LOW;
  36.     SF_NOTIFY_ORDER_MASK               = (SF_NOTIFY_ORDER_HIGH or SF_NOTIFY_ORDER_MEDIUM or SF_NOTIFY_ORDER_LOW);
  37.  
  38.  
  39.  
  40. type
  41.     PVOID = Pointer;
  42.     LPVOID = Pointer;
  43.     PCardinal = ^Cardinal;
  44.     SF_REQ_TYPE = (SF_REQ_SEND_RESPONSE_HEADER, SF_REQ_ADD_HEADERS_ON_DENIAL,
  45.                    SF_REQ_SET_NEXT_READ_SIZE, SF_REQ_SET_PROXY_INFO);
  46.  
  47.     TFuncPlaceHolder = POINTER;
  48.  
  49.     THTTP_FILTER_CONTEXT = record
  50.       cbSize             : DWORD;
  51.       Revision           : DWORD;
  52.       ServerContext      : PVOID;
  53.       ulReserved         : DWORD;
  54.       fIsSecurePort      : BOOL;
  55.       pFilterContext     : PVOID;
  56.       GetServerVariable  : TFuncPlaceHolder; {TGetServerVariable;}
  57.       AddResponseHeaders : TFuncPlaceHolder; {TAddResponseHeaders;}
  58.       WriteClient        : TFuncPlaceHolder; {TWriteClient;}
  59.       AllocMen           : TFuncPlaceHolder; {TAllocMem;}
  60.       ServerSupportFunc  : TFuncPlaceHolder; {TServerSupportFunc;}
  61.     end;
  62.  
  63.     HTTP_FILTER_CONTEXT = THTTP_FILTER_CONTEXT;
  64.     PHTTP_FILTER_CONTEXT = ^HTTP_FILTER_CONTEXT;
  65.  
  66.     TGetServerVariable  = Function(var pfc          : THTTP_FILTER_CONTEXT;
  67.                                        VariableName : PChar;
  68.                                        Buffer       : PChar;
  69.                                        var BuffSize : DWORD) : BOOL; StdCall;
  70.  
  71.     TAddResponseHeaders = Function(var pfc          : THTTP_FILTER_CONTEXT;
  72.                                        Headers      : PChar;
  73.                                        Reserved     : DWORD) : BOOL; StdCall;
  74.  
  75.     TWriteClient        = Function(var pfc          : THTTP_FILTER_CONTEXT;
  76.                                        Buffer       : LPVOID;
  77.                                        dwBytes      : LPDWORD;
  78.                                        Reserved     : DWORD) : BOOL;  StdCall;
  79.  
  80.     TAllocMem           = Procedure(var pfc         : THTTP_FILTER_CONTEXT;
  81.                                         cbSize      : DWORD;
  82.                                         dwReserved  : DWORD); StdCall;
  83.  
  84.  
  85.     TServerSupportFunc = Function(var  pfc          : THTTP_FILTER_CONTEXT;
  86.                                        sfReq        : SF_REQ_TYPE;
  87.                                        pData        : PVOID;
  88.                                        ul1          : DWORD;
  89.                                        ul2          : DWORD) : BOOL; StdCall;
  90.  
  91.  
  92.  
  93.     THTTP_FILTER_RAW_DATA = record
  94.       pvInData   : PVOID;
  95.       cbInData   : DWORD;
  96.       cbInBuffer : DWORD;
  97.       dwReserved : DWORD;
  98.     end;
  99.  
  100.     HTTP_FILTER_RAW_DATA  = THTTP_FILTER_RAW_DATA;
  101.     PHTTP_FILTER_RAW_DATA = ^HTTP_FILTER_RAW_DATA;
  102.  
  103.  
  104.  
  105.     TGetHeader = Function(var pfc       : THTTP_FILTER_CONTEXT;
  106.                               lpszName  : PChar;
  107.                               lpvBuffer : LPVOID;
  108.                               lpdwSize  : LPDWORD) : BOOL; StdCall;
  109.  
  110.  
  111.  
  112.     TSetHeader = Function(var pfc : THTTP_FILTER_CONTEXT;
  113.                               lpszName  : PChar;
  114.                               lpszValue : PChar) : BOOL; StdCall;
  115.  
  116.  
  117.  
  118.     TAddHeader = Function(var pfc : THTTP_FILTER_CONTEXT;
  119.                               lpszName  : PChar;
  120.                               lpszValue : PChar) : BOOL; StdCall;
  121.  
  122.  
  123.     THTTP_FILTER_PREPROC_HEADERS = record
  124.       GetHeader  : TGetHeader;
  125.       SetHeader  : TSetHeader;
  126.       AddHeader  : TAddHeader;
  127.       dwReserved : DWORD;
  128.     end;
  129.  
  130.     HTTP_FILTER_PREPROC_HEADERS  = THTTP_FILTER_PREPROC_HEADERS;
  131.     PHTTP_FILTER_PREPROC_HEADERS = ^HTTP_FILTER_PREPROC_HEADERS;
  132.  
  133.     THTTP_FILTER_AUTHENT = record
  134.       pszUser        : PChar;
  135.       cbUserBuff     : DWORD;
  136.       pszPassword    : PChar;
  137.       cbPasswordBuff : DWORD;
  138.     end;
  139.  
  140.     HTTP_FILTER_AUTHENT  = THTTP_FILTER_AUTHENT;
  141.     PHTTP_FILTER_AUTHENT = ^HTTP_FILTER_AUTHENT;
  142.  
  143.     THTTP_FILTER_URL_MAP = record
  144.       pszURL : PChar;
  145.       pszPhysicalPath : PChar;
  146.       cbPathBuff : DWORD;
  147.     end;
  148.  
  149.     HTTP_FILTER_URL_MAP  = THTTP_FILTER_URL_MAP;
  150.     PHTTP_FILTER_URL_MAP = ^HTTP_FILTER_URL_MAP;
  151.  
  152.     THTTP_FILTER_LOG = record
  153.       pszClientHostName : PChar;
  154.       pszClientUserName : PChar;
  155.       pszServerName     : PChar;
  156.       pszOperation      : PChar;
  157.       pszTarget         : PChar;
  158.       pszParameters     : PChar;
  159.       dwHttpStatus      : DWORD;
  160.       dwWin32Status     : DWORD;
  161.     end;
  162.  
  163.     HTTP_FILTER_LOG  = THTTP_FILTER_LOG;
  164.     PHTTP_FILTER_LOG = ^HTTP_FILTER_LOG;
  165.  
  166.     THTTP_FILTER_VERSION = record
  167.       dwServerFilterVersion : DWORD;
  168.       dwFilterVersion       : DWORD;
  169.       lpszFilterDesc        : array [0..(SF_MAX_FILTER_DESC_LEN-1)] of Char;
  170.       dwFlags               : DWORD;
  171.     end;
  172.  
  173.     HTTP_FILTER_VERSION = THTTP_FILTER_VERSION;
  174.     PHTTP_FILTER_VERSION = ^HTTP_FILTER_VERSION;
  175.  
  176.     TFilter=class
  177.      public
  178.       procedure AssignContext(var thisFC: HTTP_FILTER_CONTEXT);
  179.       function  GetServerVar(varName: String): String;
  180.      private
  181.       pFC: PHTTP_FILTER_CONTEXT;
  182.     end;
  183.  
  184. // *******************
  185. // Start of code
  186. // *******************
  187.  
  188. procedure TFilter.AssignContext(var thisFC: HTTP_FILTER_CONTEXT);
  189. begin
  190.   pFC:=@thisFC;
  191. end;
  192.  
  193. function  TFilter.GetServerVar(varName: String): String;
  194. var
  195.   ss: ShortString;
  196.   buf: array[0..255] of char absolute ss;
  197.   len: Integer;
  198.   FNGetServerVariable: TGetServerVariable;
  199. begin
  200.   len:=255;
  201.   @FNGetServerVariable:=pFC^.GetServerVariable;
  202.   if FNGetServerVariable(pFC^, PChar(varName), Pointer(@buf[1]), len ) then
  203.   begin
  204.     ss[0]:=Char(len);
  205.     result:=ss;
  206.   end
  207.   else
  208.     Result:='<UNKNOWN>';
  209. end;
  210.  
  211.  
  212. Function GetFilterVersion(var pVer : HTTP_FILTER_VERSION) : BOOL; export; stdcall;
  213. begin
  214.   pVer.dwFilterVersion := MAKELONG(0, 1);
  215.   StrPCopy(pVer.lpszFilterDesc, 'Re-map URL version 0.2.');
  216.   pVer.dwFlags := (SF_NOTIFY_URL_MAP);
  217.   result := True;
  218. end;
  219.  
  220. function RemapURL(const url: String): String;
  221. var
  222.   f: TextFile;
  223.   bufLen: Integer;
  224.   path: String[255];
  225.   lineBuf: String;
  226.   inURL: String;
  227.   outURL: String;
  228. begin
  229.   Result:='';
  230.  
  231.   // Create a data file in the same directory the DLL itself resides.
  232.   bufLen:=GetModuleFileName( GetModuleHandle('MAPURL.DLL'), PChar(@path[1]), 255);
  233.   SetLength(path, bufLen);
  234.  
  235.   path:=ExtractFilePath(path)+'#urlmap.txt';
  236.  
  237.   // Create the file if it doesn't exist and load
  238.   // it with some demo info
  239.   if NOT FileExists(path) then
  240.   begin
  241.     AssignFile(f, path);
  242.     try
  243.      Rewrite(f);
  244.      Writeln(f, '; INURL OUTURL');
  245.      Writeln(f, '; remap.htm  c:\autoexec.bat    A request for remap.htm (in the server root) will send back your autoexec.bat file');
  246.      Writeln(f, ';');
  247.      Writeln(f, '; DELETE THIS NEXT LINE!!! It is for demo purposes only');
  248.      Writeln(f, 'remap.htm c:\autoexec.bat');
  249.      CloseFile(f);
  250.     except
  251.       ;
  252.     end;
  253.     exit;
  254.   end;
  255.  
  256.   AssignFile(f, path);
  257.   try
  258.     Reset(f);
  259.     try
  260.       while (not EOF(f)) do
  261.       begin
  262.          // Read a line
  263.          Readln(f, lineBuf);
  264.  
  265.          // Skip if it's a comment
  266.          if (Length(lineBuf)>0) AND (lineBuf[1]=';') then
  267.            continue;
  268.  
  269.          // Parse
  270.          inURL:=UpperCase(GetToken(lineBuf, 1, [' ']));
  271.          outURL:=UpperCase(GetToken(lineBuf, 2, [' ']));
  272.  
  273.          // Should we remap?
  274.          if Pos(inURL, url)=1 then
  275.          begin
  276.            Result:=outURL+Copy(url, Length(inURL)+1, 255);
  277.            break;
  278.          end;
  279.       end;
  280.     finally
  281.       CloseFile(f);
  282.     end;
  283.   except
  284.     ;
  285.   end;
  286.  
  287. end;
  288.  
  289.  
  290.  
  291. Function HttpFilterProc(var pfc : HTTP_FILTER_CONTEXT; NotificationType : DWORD; pvNotification : LPVOID) : DWORD; export; stdcall;
  292. var
  293.   filter: TFilter;
  294.  
  295.    function OnURLMap : DWORD;
  296.    var
  297.      mapStruct: PHTTP_FILTER_URL_MAP;
  298.      url: String;
  299.    begin
  300.      result := SF_STATUS_REQ_NEXT_NOTIFICATION;
  301.  
  302.      mapStruct:=PHTTP_FILTER_URL_MAP(pvNotification);
  303.  
  304.      // Extract the path info we need to try and map
  305.      url:=UpperCase( String(mapStruct.pszURL) );
  306.  
  307.      // Does this map?
  308.      url:=RemapURL(url);
  309.  
  310.      // If it maps, then copy it
  311.      if url<>'' then
  312.        StrCopy(mapStruct.pszPhysicalPath, PChar(url) );
  313.    end;
  314.  
  315.  
  316. begin
  317.   result:=SF_STATUS_REQ_NEXT_NOTIFICATION;
  318.   //Exit;
  319.  
  320.   try
  321.     filter:=TFilter.Create;
  322.  
  323.     filter.AssignContext(pfc);
  324.  
  325.     Case NotificationType of
  326.       SF_NOTIFY_URL_MAP:
  327.       begin
  328.         result:=OnURLMap;
  329.       end;
  330.     end;
  331.     filter.Free;
  332.   except
  333.     ;
  334.   end;
  335. end;
  336.  
  337.  
  338.  
  339.  
  340.  
  341. exports
  342.  
  343.   HttpFilterProc,
  344.  
  345.   GetFilterVersion;
  346.  
  347.  
  348.  
  349.  
  350.  
  351. end.
  352.  
  353.  
  354.  
  355.