unit uRODXHTTPHeaderTools; interface /////////////////////////////////////////////////////////////////////////////// // Component: TDXHTTPHeaderTools // Author: G.E. Ozz Nixon Jr. (onixon@dxsock.com) // ======================================================================== // Source Owner: DX, Inc. 1995-2002 // Copyright: All code is the property of DX, Inc. Licensed for // resell by Brain Patchwork DX (tm) and part of the // DX (r) product lines, which are (c) 1999-2002 // DX, Inc. Source may not be distributed without // written permission from both Brain Patchwork DX, // and DX, Inc. // License: (Reminder), None of this code can be added to other // developer products without permission. This includes // but not limited to DCU's, DCP's, DLL's, OCX's, or // any other form of merging our technologies. All of // your products released to a public consumer be it // shareware, freeware, commercial, etc. must contain a // license notification somewhere visible in the // application. // Example is Internet Explorer - Help->About screen // shows the licensed code contained in the application. // Code Version: (3rd Generation Code) // ======================================================================== // Description: // ======================================================================== /////////////////////////////////////////////////////////////////////////////// {$I uRODXSock.def} uses uRODXString, Classes; Type PHeaderInfo=^THeaderInfo; THeaderInfo=Record ContentLength:Integer; Raw:AnsiString; // Original Header Request Protocol:AnsiString; Method:AnsiString; //GET, HEAD, etc. All caps!!! URI:AnsiString; PhysPath:AnsiString; Allow:AnsiString; AuthType:AnsiString; // BASIC AuthName:AnsiString; AuthPass:AnsiString; Date:AnsiString; Pragma:AnsiString; CacheControl:AnsiString; Connection:AnsiString; TransferEncoding:AnsiString; Upgrade:AnsiString; Via:AnsiString; Host:AnsiString; // multiple domains on single IP! From:AnsiString; IfModSince:AnsiString; IfMatch:AnsiString; IfNoneMatch:AnsiString; IfRange:AnsiString; IfUnModSince:AnsiString; MaxForwards:AnsiString; ProxyAuthorization:AnsiString; KeepAlive:AnsiString; PublicCache:AnsiString; // 2.3 renamed field! Range:AnsiString; Referer:AnsiString; UserAgent:AnsiString; ContentType:AnsiString; Accept:AnsiString; AcceptCharset:AnsiString; AcceptEncoding:AnsiString; AcceptLanguage:AnsiString; ClientName:AnsiString; ClientAddr:AnsiString; ClientHost:AnsiString; Cookie:AnsiString; QueryString:AnsiString; Weferer:AnsiString; WserAgent:AnsiString; Forwarded:AnsiString; ForwardedFor:AnsiString; ProxyConnection:AnsiString; CacheInfo:AnsiString; PostData:AnsiString; // 3.0 HostRootPath:AnsiString; // needed for SSI+ Banner routines and ISAPI Variables All_RAW:AnsiString; // needed for trace, and ISAPIs! All_HTTP:AnsiString; Unknown:AnsiString; end; TDXHTTPHeaderTools = class(TDXComponent) private fSessionHeader:PHeaderInfo; protected Function FindUnknownHeader(ServerVariable:AnsiString):AnsiString; Procedure ReplaceUnknownHeader(ServerVariable, VariableValue:AnsiString); Function UnknownHeaderExists(ServerVariable:AnsiString):Boolean; public constructor Create(AOwner:TComponent); {$IFNDEF OBJECTS_ONLY} override; {$ENDIF} Destructor Destroy; override; Procedure Init(HTTPHeader:PHeaderInfo); // 2.0.12 Function HeaderGetString(ServerVariable:AnsiString):AnsiString; Function HeaderGetInteger(ServerVariable:AnsiString):Integer; Function HeaderDataExists(ServerVariable:AnsiString):Boolean; Function QueryGetString(ServerVariable:AnsiString):AnsiString; Function QueryGetInteger(ServerVariable:AnsiString):Integer; Function QueryDataExists(ServerVariable:AnsiString):Boolean; Function AddHeader(ServerVariable, VariableValue:AnsiString):Boolean; Function SetHeader(ServerVariable, VariableValue:AnsiString):Boolean; Function ToStrings:TStrings; published end; implementation Uses SysUtils {$IFDEF DELPHI2009UP},AnsiStrings{$ENDIF}; constructor TDXHTTPHeaderTools.Create(AOwner:TComponent); Begin Inherited Create(AOwner); end; Destructor TDXHTTPHeaderTools.Destroy; Begin Inherited Destroy; end; Procedure TDXHTTPHeaderTools.Init(HTTPHeader:PHeaderInfo); Begin fSessionHeader:=HTTPHeader; fSessionHeader^.ContentLength:=0; End; Function TDXHTTPHeaderTools.HeaderGetString(ServerVariable:AnsiString):AnsiString; Var Ch:AnsiChar; Ws:AnsiString; URI2:AnsiString; Begin Result:=''; Ws:=UpperCase(ServerVariable); If Ws='' then Exit; //2.0.11 If (Copy(Ws,1,5)='HTTP_') then Begin Delete(Ws,1,5); // 3.0 End; Ch:=Ws[1]; With fSessionHeader^ do Case Ch of 'A':If (Ws='ALLOW') then Result:=Allow Else If (Ws='ALL_RAW') then Result:=All_Raw // .9k & 2.3b Else If (Ws='ALL_HTTP') then Result:=All_HTTP // 3.0 Else If (Ws='AUTHTYPE') or (Ws='AUTH_TYPE') then Result:=AuthType Else If (Ws='AUTHNAME') or (Ws='AUTH_NAME') or (Ws='AUTH_USER') then Result:=AuthName Else If (Ws='AUTHPASS') or (Ws='AUTH_PASS') or (Ws='AUTH_PASSWORD') then Result:=AuthPass Else If (Ws='ACCEPT') then Result:=Accept Else If (Ws='ACCEPT_CHARSET') or (Ws='ACCEPTCHARSET') then Result:=AcceptCharset Else If (Ws='ACCEPT_ENCODING') or (Ws='ACCEPTENCODING') then Result:=AcceptEncoding Else If (Ws='ACCEPT_LANGUAGE') or (Ws='ACCEPTLANGUAGE') then Result:=AcceptLanguage Else Result := FindUnknownHeader(ServerVariable); 'C':If (Ws='CONTENT_LENGTH') or (Ws='CONTENTLENGTH') then Result:=Ansi_IntToStr(ContentLength) Else If (Ws='CACHECONTROL') or (Ws='CACHE_CONTROL') then Result:=CacheControl Else If (Ws='CACHE_INFO') then Result:=CacheInfo Else If (Ws='CONNECTION') then Result:=Connection Else If (Ws='CONTENT_TYPE') or (Ws='CONTENTTYPE') then Result:=ContentType Else If (Ws='CLIENTNAME') or (Ws='CLIENT_NAME') then Result:=ClientName Else If (Ws='CLIENTADDR') or (Ws='CLIENT_ADDR') then Result:=ClientAddr Else If (Ws='COOKIE') then Result:=Cookie Else Result := FindUnknownHeader(ServerVariable); 'D':If (Ws='DATE') then Result:=Date Else Result := FindUnknownHeader(ServerVariable); 'F':If (Ws='FROM') then Result:=From Else If (Ws='FORWARDED') then Result:=Forwarded Else If (Ws='FORWARDED_FOR') then Result:=ForwardedFor Else Result := FindUnknownHeader(ServerVariable); 'H':If (Ws='HOST') then Begin Result:=Host; If Pos(AnsiChar('@'),Result)>0 then Delete(Result,1,Pos(AnsiChar(':'),Result)); If Pos(AnsiChar(':'),Result)>0 then Delete(Result,Pos(AnsiChar(':'),Result),Length(Result)); End Else If (Ws='HTTPS') then Result:='off' Else Result := FindUnknownHeader(ServerVariable); 'I':If (Ws='IFMODSINCE') or (Ws='IF_MODSINCE') or (Ws='IF_MOD_SINCE') then Result:=IfModSince Else If (Ws='IFMATCH') or (Ws='IF_MATCH') then Result:=IfMatch Else If (Ws='IFNONEMATCH') or (Ws='IF_NONEMATCH') or (Ws='IF_NONE_MATCH') then Result:=IfNoneMatch Else If (Ws='IFRANGE') or (Ws='IF_RANGE') then Result:=IfRange Else If (Ws='IFUNMODSINCE') or (Ws='IF_UNMODSINCE') or (Ws='IF_UNMOD_SINCE') then Result:=IfUnModSince Else Result := FindUnknownHeader(ServerVariable); 'K':If (Ws='KEEPALIVE') or (Ws='KEEP_ALIVE') then Result:=KeepAlive Else Result := FindUnknownHeader(ServerVariable); 'M':If (Ws='METHOD') then Result:=Method Else If (Ws='MAXFORWARDS') or (Ws='MAX_FORWARDS') then Result:=MaxForwards Else Result := FindUnknownHeader(ServerVariable); 'P':If (Ws='PROTOCOL') then Result:=Protocol Else If (Ws='PRAGMA') then Result:=Pragma Else if (Ws='PROXYAUTHORIZATION') or (Ws='PROXY_AUTHORIZATION') then Result:=ProxyAuthorization Else if (Ws='PUBLIC') then Result:=PublicCache Else if (Ws='PROXY_CONNECTION') then Result:=ProxyConnection Else Result := FindUnknownHeader(ServerVariable); 'Q':If (Ws='QUERYSTRING') or (Ws='QUERY_STRING') then Result:=QueryString Else Result := FindUnknownHeader(ServerVariable); 'R':If (Ws='RANGE') then Result:=Range Else If (Ws='REFERER') or (Ws='REFERRER') or (Ws='REFFERER') then Result:=Referer Else If (Ws='REQUEST_METHOD') then Result:=Method Else If (Ws='REMOTE_NAME') or (Ws='REMOTE_HOST') then Result:=ClientName Else If (Ws='REMOTE_ADDR') then Result:=ClientAddr Else If (Ws='REQUEST_URI') then Begin URI2:=ToUnixSlashes(URI); If Pos(AnsiChar('/'),URI2)=0 then Result:=AnsiChar('/')+URI2 Else Begin If Copy(URI2,1,1)<>'/' then URI2:=AnsiChar('/')+URI2; Result:=URI2; // 4/2/2002 Copy(URI2,1,PosLastChar('/',URI2)); End; End Else Result := FindUnknownHeader(ServerVariable); 'S':If (Ws='SERVER_PROTOCOL') then Result:=Protocol Else If (Ws='SERVER_NAME') then Begin Result:=Host; If Pos(AnsiChar('@'),Result)>0 then Delete(Result,1,Pos(AnsiChar(':'),Result)); If Pos(AnsiChar(':'),Result)>0 then Delete(Result,Pos(AnsiChar(':'),Result),Length(Result)); End Else If (Ws='SERVER_PORT_SECURE') then Result:=AnsiChar('0') Else Result := FindUnknownHeader(ServerVariable); 'T':If (Ws='TRANSFERENCODING') or (Ws='TRANSFER_ENCODING') then Result:=TransferEncoding Else Result := FindUnknownHeader(ServerVariable); 'U':If (Ws='URI') then Begin URI2:=ToUnixSlashes(URI); If Pos(AnsiChar('/'),URI2)=0 then Result:=AnsiChar('/')+URI2 Else Begin If Copy(URI2,1,1)<>AnsiChar('/') then URI2:=AnsiChar('/')+URI2; Result:=URI2; // 4/2/2002 Copy(URI2,1,PosLastChar('/',URI2)); End; End Else If (Ws='URL') then Begin URI2:=ToUnixSlashes(URI); If Copy(URI2,1,1)=AnsiChar('/') then Result:=URI2 Else Result:=AnsiChar('/')+URI2; End Else If (Ws='UPGRADE') then Result:=Upgrade Else if (Ws='USERAGENT') or (Ws='USER_AGENT') then Result:=UserAgent Else Result := FindUnknownHeader(ServerVariable); 'V':If (Ws='VIA') then Result:=Via Else Result := FindUnknownHeader(ServerVariable); 'W':If (Ws='WEFERER') then Result:=Weferer Else If (Ws='WSER_AGENT') then Result:=WserAgent Else Result := FindUnknownHeader(ServerVariable); Else Result := FindUnknownHeader(ServerVariable); End; End; Function TDXHTTPHeaderTools.HeaderGetInteger(ServerVariable:AnsiString):Integer; Var Ch:AnsiChar; Ws:AnsiString; Begin Result:=0; Ws:=UpperCase(ServerVariable); If Ws='' then Exit; // 2.0.11 Ch:=Ws[1]; With fSessionHeader^ do Case Ch of 'C':If (Ws='CONTENT_LENGTH') or (Ws='CONTENTLENGTH') then Result:=ContentLength; End; End; Function TDXHTTPHeaderTools.HeaderDataExists(ServerVariable:AnsiString):Boolean; Begin Result:=HeaderGetString(ServerVariable)<>''; End; // 2.0.12 Function TDXHTTPHeaderTools.QueryGetString(ServerVariable:AnsiString):AnsiString; Var Ws:AnsiString; Tmp:AnsiString; Value:AnsiString; Begin Result:=''; Tmp:=fSessionHeader^.QueryString+AnsiChar('&'); While (Pos(AnsiChar('&'),Tmp)>0) do Begin Ws:=Copy(Tmp,1,Pos(AnsiChar('&'),Tmp)-1); Delete(Tmp,1,Pos(AnsiChar('&'),Tmp)); Value:=Copy(Ws,1,Pos(AnsiChar('='),Ws)-1); Delete(Ws,1,Pos(AnsiChar('='),Ws)); If UpperCase(Value)=UpperCase(ServerVariable) then Begin If Result<>'' then Result:=Result+AnsiChar(#13)+AnsiChar(#10)+Ws Else Result:=Ws; End; End; End; Function TDXHTTPHeaderTools.QueryGetInteger(ServerVariable:AnsiString):Integer; Var Ws:AnsiString; Begin Ws:=QueryGetString(ServerVariable); If (Ws<>'') and (IsNumericString(Ws)) then Result:=Ansi_StrToInt(Ws) Else Result:=-1; End; Function TDXHTTPHeaderTools.QueryDataExists(ServerVariable:AnsiString):Boolean; Begin Result:=QueryGetString(ServerVariable)<>''; End; Function TDXHTTPHeaderTools.AddHeader(ServerVariable, VariableValue:AnsiString):Boolean; Var Ch:AnsiChar; Ws:AnsiString; Procedure AddToUnknown; // 7-27 Begin If fSessionHeader^.Unknown='' then fSessionHeader^.Unknown:=ServerVariable+AnsiString(': ')+VariableValue Else fSessionHeader^.Unknown:=fSessionHeader^.Unknown+AnsiString(#13#10)+ServerVariable+AnsiString(': ')+VariableValue; End; Begin Result:=False; Ws:=Uppercase(ServerVariable); If Ws='' then Exit; // 7-27 Ws:=StringReplace(Ws,AnsiChar('-'),AnsiChar('_'),[rfReplaceAll]); Ch:=Ws[1]; With fSessionHeader^ do Case Ch of 'A':If (Ws='ALLOW') then Allow:=VariableValue Else If (Ws='AUTHTYPE') or (Ws='AUTH_TYPE') then AuthType:=VariableValue Else If (Ws='AUTHNAME') or (Ws='AUTH_NAME') then AuthName:=VariableValue Else If (Ws='AUTHPASS') or (Ws='AUTH_PASS') then AuthPass:=VariableValue Else If (Ws='ACCEPT') then Accept:=VariableValue Else If (Ws='ACCEPT_CHARSET') or (Ws='ACCEPTCHARSET') then AcceptCharset:=VariableValue Else If (Ws='ACCEPT_ENCODING') or (Ws='ACCEPTENCODING') then AcceptEncoding:=VariableValue Else If (Ws='ACCEPT_LANGUAGE') or (Ws='ACCEPTLANGUAGE') then AcceptLanguage:=VariableValue Else AddToUnknown; 'C':If (Ws='CONTENT_LENGTH') or (Ws='CONTENTLENGTH') then ContentLength:=Ansi_StrToInt(VariableValue) Else If (Ws='CACHECONTROL') or (Ws='CACHE_CONTROL') then CacheControl:=VariableValue Else If (Ws='CACHE_INFO') then CacheInfo:=VariableValue Else If (Ws='CONNECTION') then Connection:=VariableValue Else If (Ws='CONTENT_TYPE') or (Ws='CONTENTTYPE') then ContentType:=VariableValue Else If (Ws='CLIENTNAME') or (Ws='CLIENT_NAME') then ClientName:=VariableValue Else If (Ws='CLIENTADDR') or (Ws='CLIENT_ADDR') then ClientAddr:=VariableValue Else If (Ws='COOKIE') then Cookie:=VariableValue Else AddToUnknown; 'D':If (Ws='DATE') then Date:=VariableValue Else AddToUnknown; 'F':If (Ws='FROM') then From:=VariableValue Else If (Ws='FORWARDED') then Forwarded:=VariableValue Else If (Ws='FORWARDED_FOR') then ForwardedFor:=VariableValue Else AddToUnknown; 'H':If (Ws='HOST') then Host:=VariableValue Else AddToUnknown; 'I':If (Ws='IFMODSINCE') or (Ws='IF_MODSINCE') or (Ws='IF_MOD_SINCE') then IfModSince:=VariableValue Else If (Ws='IFMATCH') or (Ws='IF_MATCH') then IfMatch:=VariableValue Else If (Ws='IFNONEMATCH') or (Ws='IF_NONEMATCH') or (Ws='IF_NONE_MATCH') then IfNoneMatch:=VariableValue Else If (Ws='IFRANGE') or (Ws='IF_RANGE') then IfRange:=VariableValue Else If (Ws='IFUNMODSINCE') or (Ws='IF_UNMODSINCE') or (Ws='IF_UNMOD_SINCE') then IfUnModSince:=VariableValue Else AddToUnknown; 'K':If (Ws='KEEPALIVE') or (Ws='KEEP_ALIVE') then KeepAlive:=VariableValue Else AddToUnknown; 'M':If (Ws='METHOD') then Method:=VariableValue Else If (Ws='MAXFORWARDS') or (Ws='MAX_FORWARDS') then MaxForwards:=VariableValue Else AddToUnknown; 'P':If (Ws='PROTOCOL') then Protocol:=VariableValue Else If (Ws='PRAGMA') then Pragma:=VariableValue Else if (Ws='PROXYAUTHORIZATION') or (Ws='PROXY_AUTHORIZATION') then ProxyAuthorization:=VariableValue Else if (Ws='PUBLIC') then PublicCache:=VariableValue Else if (Ws='PROXY_CONNECTION') then ProxyConnection:=VariableValue Else AddToUnknown; 'Q':If (Ws='QUERYSTRING') or (Ws='QUERY_STRING') then QueryString:=VariableValue Else AddToUnknown; 'R':If (Ws='RANGE') then Range:=VariableValue Else If (Ws='REFERER') or (Ws='REFERRER') or (Ws='REFFERER') then Referer:=VariableValue Else AddToUnknown; 'U':If (Ws='URI') then URI:=VariableValue Else If (Ws='UPGRADE') then Upgrade:=VariableValue Else if (Ws='USERAGENT') or (Ws='USER_AGENT') then UserAgent:=VariableValue Else AddToUnknown; 'T':If (Ws='TRANSFERENCODING') or (Ws='TRANSFER_ENCODING') then TransferEncoding:=VariableValue Else AddToUnknown; 'V':If (Ws='VIA') then Via:=VariableValue // 7-27 Else AddToUnknown; 'W':If (Ws='WEFERER') then Weferer:=VariableValue // 7-27 Else If (Ws='WSER_AGENT') then WserAgent:=VariableValue // 7-27 Else AddToUnknown; Else AddToUnknown; End;//case Result:=True; End; Function TDXHTTPHeaderTools.SetHeader(ServerVariable, VariableValue:AnsiString):Boolean; Begin Result:=AddHeader(ServerVariable, VariableValue); End; Function TDXHTTPHeaderTools.FindUnknownHeader(ServerVariable:AnsiString):AnsiString; var line, buf:AnsiString; i : Integer; Begin line:=fSessionHeader^.Unknown; i := Pos(ServerVariable, line); if i <> 0 then Begin buf := Copy(line, i, Length(line)); i := Pos(AnsiString(#13#10), buf); buf := Copy(buf, 0, i-1); i := Pos(AnsiChar(#32), buf); Result := Copy(buf, i, Length(buf)); End; //IF End; Procedure TDXHTTPHeaderTools.ReplaceUnknownHeader(ServerVariable, VariableValue:AnsiString); var line:PAnsiString; str, buf:AnsiString; i, k, m:Integer; Begin if Not UnknownHeaderExists(ServerVariable) then Exit; line:=@fSessionHeader^.Unknown; k := Pos(ServerVariable, line^); if k <> 0 then Begin str := Copy(line^, k, Length(line^)); m := Pos(AnsiString(#13#10), str); buf := Copy(str, 0, k-1); i := Pos(AnsiChar(#32), buf); k := k + i; Delete(line^, k, m); Insert(VariableValue, line^, k); End; End; Function TDXHTTPHeaderTools.UnknownHeaderExists(ServerVariable:AnsiString):Boolean; Begin if ServerVariable = '' then Result:=False Else if fSessionHeader^.Unknown = '' then Result:=False Else if Pos(ServerVariable, fSessionHeader^.Unknown) = 0 then Result:=False Else Result:=True; End; Function TDXHTTPHeaderTools.ToStrings:TStrings; procedure AddIntoStringList(res:TStrings; AValue: AnsiString); begin Res.Add({$IFDEF UNICODE}AnsiStringToWideString{$ENDIF}(AValue)); end; var res:TStrings; endch:AnsiString; split :AnsiString; // CleanLoop:Integer; Begin split:=': '; endch :='';// 7-27 #13#10; res := TStringList.Create; With fSessionHeader^ do Begin if Allow <> '' then AddIntoStringList(Res,'ALLOW'+split+Allow+endch); if AuthType <> '' then AddIntoStringList(Res,'AUTHTYPE'+split+AuthType+endch); if AuthName <> '' then AddIntoStringList(Res,'AUTHNAME'+split+AuthName+endch); if AuthPass <> '' then AddIntoStringList(Res,'AUTHPASS'+split+AuthPass+endch); if Accept <> '' then AddIntoStringList(Res,'ACCEPT'+split+Accept+endch); if AcceptCharset <> '' then AddIntoStringList(Res,'ACCEPT-CHARSET'+split+AcceptCharset+endch); if AcceptEncoding <> '' then AddIntoStringList(Res,'ACCEPT-ENCODING'+split+AcceptEncoding+endch); if AcceptLanguage <> '' then AddIntoStringList(Res,'ACCEPT-LANGUAGE'+split+AcceptLanguage+endch); if ContentLength <> 0 then AddIntoStringList(Res,'CONTENT-LENGTH'+split+Ansi_IntToStr(ContentLength)+endch); if CacheControl <> '' then // 7-27 AddIntoStringList(Res,'CACHE-CONTROL'+split+CacheControl+endch); if CacheInfo <> '' then // 7-27 AddIntoStringList(Res,'CACHE-INFO'+split+CacheInfo+endch); if Connection <> '' then AddIntoStringList(Res,'CONNECTION'+split+Connection+endch); if ContentType <> '' then AddIntoStringList(Res,'CONTENT-TYPE'+split+ContentType+endch); if ClientName <> '' then AddIntoStringList(Res,'CLIENTNAME'+split+ClientName+endch); if ClientAddr <> '' then AddIntoStringList(Res,'CLIENTADDR'+split+ClientAddr+endch); if Cookie <> '' then AddIntoStringList(Res,'COOKIE'+split+Cookie+endch); if Date <> '' then AddIntoStringList(Res,'DATE'+split+Date+endch); if From <> '' then AddIntoStringList(Res,'FROM'+split+From+endch); if Forwarded <> '' then AddIntoStringList(Res,'FORWARDED'+split+Forwarded+endch); if ForwardedFor <> '' then AddIntoStringList(Res,'FORWARDED-FOR'+split+ForwardedFor+endch); if Host <> '' then AddIntoStringList(Res,'HOST'+split+Host+endch); if IfModSince <> '' then AddIntoStringList(Res,'IFMODSINCE'+split+IfModSince+endch); if IfMatch <> '' then AddIntoStringList(Res,'IFMATCH'+split+IfMatch+endch); if IfNoneMatch <> '' then AddIntoStringList(Res,'IFNONEMATCH'+split+IfNoneMatch+endch); if IfRange <> '' then AddIntoStringList(Res,'IFRANGE'+split+IfRange+endch); if IfUnModSince <> '' then AddIntoStringList(Res,'IFUNMODSINCE'+split+IfUnModSince+endch); if KeepAlive <> '' then AddIntoStringList(Res,'KEEPALIVE'+split+KeepAlive+endch); if Method <> '' then AddIntoStringList(Res,'METHOD'+split+Method+endch); if MaxForwards <> '' then AddIntoStringList(Res,'MAXFORWARDS'+split+MaxForwards+endch); if Protocol <> '' then AddIntoStringList(Res,'PROTOCOL'+split+Protocol+endch); if ProxyConnection <> '' then AddIntoStringList(Res,'PROXY-CONNECTION'+split+ProxyConnection+endch); if Pragma <> '' then AddIntoStringList(Res,'PRAGMA'+split+Pragma+endch); if ProxyAuthorization <> '' then AddIntoStringList(Res,'PROXYAUTHORIZATION'+split+ProxyAuthorization+endch); if PublicCache <> '' then AddIntoStringList(Res,'PUBLIC'+split+PublicCache+endch); if QueryString <> '' then AddIntoStringList(Res,'QUERYSTRING'+split+QueryString+endch); if Range <> '' then AddIntoStringList(Res,'RANGE'+split+Range+endch); if Referer <> '' then AddIntoStringList(Res,'REFERER'+split+Referer+endch); if URI <> '' then AddIntoStringList(Res,'URI'+split+URI+endch); if Upgrade <> '' then AddIntoStringList(Res,'UPGRADE'+split+Upgrade+endch); if UserAgent <> '' then AddIntoStringList(Res,'USERAGENT'+split+UserAgent+endch); if TransferEncoding <> '' then AddIntoStringList(Res,'TRANSFERENCODING'+split+TransferEncoding+endch); if Via <> '' then AddIntoStringList(Res,'VIA'+split+Via+endch); if Weferer <> '' then AddIntoStringList(Res,'WEFERER'+split+Weferer+endch); if WserAgent <> '' then AddIntoStringList(Res,'WSER-AGENT'+split+WserAgent+endch); if Unknown <> '' then AddIntoStringList(Res,Unknown+endch); End; //With { CleanLoop:=res.Count; While CleanLoop>0 do Begin if res[CleanLoop-1]='' then res.delete(CleanLoop-1); Dec(CleanLoop); End;} Result:=res; End; end.