NMHttp.pas
上传用户:szzdds
上传日期:2013-09-18
资源大小:293k
文件大小:27k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit NMHttp;
  2. {$X+}
  3. {$R-}
  4. {$IFDEF VER100}
  5. {$DEFINE NMF3}
  6. {$ENDIF}
  7. {$IFDEF VER110}
  8. {$DEFINE NMF3}
  9. {$ENDIF}
  10. {$IFDEF VER120}
  11. {$DEFINE NMF3}
  12. {$ENDIF}
  13. {$IFDEF VER125}
  14. {$DEFINE NMF3}
  15. {$ENDIF}
  16. interface
  17. uses
  18.   SysUtils, Classes, PSock, NMExtstr, NMConst, NMUUE, NMURL, Winsock;
  19. {$IFDEF VER110}
  20. {$OBJEXPORTALL On}
  21. {$ENDIF}
  22. {$IFDEF VER120}
  23. {$OBJEXPORTALL On}
  24. {$ENDIF}
  25. {$IFDEF VER125}
  26. {$OBJEXPORTALL On}
  27. {$ENDIF}
  28. //  CompName='NMHTTP';
  29. //  Major_Version='4';
  30. //  Minor_Version='02';
  31. //  Date_Version='012798';
  32. const {Protocol}
  33.   Prt_gopher = 'gopher';
  34.   Prt_ftp = 'ftp';
  35.   Prt_str_http = ' HTTP/1.0';
  36.   Prox_Head_Str = 'Proxy-Connection: Keep-Alive';
  37.   Prox_Host_Str = 'Host: ';
  38.   Host_Accpt_Str1 = 'Accept: www/source, text/html, video/mpeg, image/jpeg, image/x-tiff';
  39.   Host_Accpt_Str2 = 'Accept: image/x-rgb, image/x-xbm, image/gif, */*, application/postscript';
  40.   Host_UserAgent = 'User-Agent';
  41.   Head_From = 'From';
  42.   Head_Host = 'Host';
  43.   Head_Cookie = 'Cookie';
  44.   Head_Referer = 'Referer';
  45.   Head_Content = 'Content-type: application/x-www-form-urlencoded';
  46.   Head_Link = 'Link: ';
  47.   Head_URI = 'URI-header: ';
  48.   Head_ContentLength = 'Content-Length: ';
  49.   Head_SetCookie = 'SET-COOKIE:';
  50.   Head_CL2 = 'CONTENT-LENGTH:';
  51.   Head_length = 'ENGTH:';
  52.   Head_Location = 'LOCATION:';
  53.   Cmd_Get = 'GET ';
  54.   Cmd_Options = 'OPTIONS ';
  55.   Cmd_Post = 'POST ';
  56.   Cmd_Put = 'PUT ';
  57.   Cmd_Head = 'HEAD ';
  58.   Cmd_Patch = 'PATCH ';
  59.   Cmd_Copy = 'COPY ';
  60.   Cmd_Move = 'MOVE ';
  61.   Cmd_Link = 'LINK ';
  62.   Cmd_Unlink = 'UNLINK ';
  63.   Cmd_Delete = 'DELETE ';
  64.   Cmd_Trace = 'TRACE ';
  65. type
  66.   {HTTP Transaction Type Options}
  67.   CmdType = (CmdGET, CmdOPTIONS, CmdHEAD, CmdPOST, CmdPUT, CmdPATCH, CmdCOPY,
  68.     CmdMOVE, CmdDELETE, CmdLINK, CmdUNLINK, CmdTRACE, CmdWRAPPED, cmdPOSTS);
  69.   HTTPException = class(Exception);
  70.   TResultEvent = procedure(Cmd: CmdType) of object;
  71.   THeaderInfo = class(TPersistent)
  72.   private
  73.     FLocalAddress: string;
  74.     FLocalProgram: string;
  75.     FCookie: string;
  76.     FReferer: string;
  77.     FUserId: string;
  78.     FPassword: string;
  79.     FProxyUserId: string;
  80.     FProxyPassword: string;
  81.   published
  82.     property LocalMailAddress: string read FLocalAddress write FLocalAddress;
  83.     property LocalProgram: string read FLocalProgram write FLocalProgram;
  84.     property Cookie: string read FCookie write FCookie;
  85.     property Referer: string read FReferer write FReferer;
  86.     property UserId: string read FUserId write FUserId;
  87.     property Password: string read FPassword write FPassword;
  88.     property ProxyUserId: string read FProxyUserId write FProxyUserId;
  89.     property ProxyPassword: string read FProxyPassword write FProxyPassword;
  90.   end;
  91.   {*******************************************************************************************
  92.   HTTP Class definition
  93.   ********************************************************************************************}
  94.   TNMHTTP = class(TPowersock)
  95.   private
  96.     FBody: string; {File Name for received file}
  97.     FHeader: string; {File Name for saving Header}
  98.     FSelector: string; {The Selector or Directory string}
  99.     FSendHeader: TexStringList;
  100.     FLocation: string;
  101.     FHeaderInfo: THeaderInfo; {Header Information}
  102.     FCookieIn: string; {Cookie - string}
  103.     FInputFileMode: boolean; {Inputs - File Mode}
  104.     FOutPutFileMode: boolean; {Output - File Mode}
  105.     FEncodePosts: boolean;
  106.     TheSendFile: string;
  107.     FSendStream: TStream; {The name of File to send}
  108.     TheDestURL: string; {The Destination URL in MOVE and COPY commands}
  109.     URL_Holder: string; {Temporary holder for URL}
  110.     ConnType: CmdType; {The Transaction type}
  111.     // URL specifics
  112.     FScheme: string;
  113.     FUser: string;
  114.     FPassword: string;
  115.     FNetworkLocation: string;
  116.     FPort: string;
  117.     FQuery: string;
  118.     FResource: string;
  119.     FParameters: string;
  120.     FPath: string;
  121.     FFragment: string;
  122.     FOnSuccess: TResultEvent; {Pointer to handler of function to execute after all bytes received}
  123.     FOnFailure: TResultEvent;
  124.     FOnAboutToSend: TNotifyEvent;
  125.     FOnRedirect: THandlerEvent;
  126.     FOnAuthenticationNeeded: TNotifyEvent;
  127. //    FOnProxyAuthenticationNeeded: TNotifyEvent;
  128.   protected
  129.     procedure HTTPConnect; virtual;
  130. //    procedure ParsetheURL; virtual;
  131.     procedure AssembleHTTPHeader; virtual;
  132.     procedure RemoveHeader; virtual;
  133.     procedure SendHTTP; virtual;
  134.   public
  135.     constructor Create(AOwner: TComponent); override;
  136.     destructor Destroy; override;
  137.     procedure Options(URL: string); virtual;
  138.     procedure Get(URL: string); virtual;
  139.     procedure Post(URL, PostData: string); virtual;
  140.     procedure Put(URL, PutData: string); virtual;
  141.     procedure Head(URL: string); virtual;
  142.     procedure Patch(URL, PatchData: string); virtual;
  143.     procedure Delete(URL: string); virtual;
  144.     procedure Trace(URL, TraceData: string); virtual;
  145.     procedure Copy(URL1, URL2: string); virtual;
  146.     procedure Move(URL1, URL2: string); virtual;
  147.     procedure Link(URL, link: string); virtual;
  148.     procedure UnLink(URL, link: string); virtual;
  149.     procedure Wrapped(URL, WrappedData: string); virtual;
  150.     procedure Abort; override;
  151.     procedure PostStream(URL: string; Stream: TStream); virtual;
  152.     property SendHeader: TExStringList read FSendHeader write FSendHeader;
  153.     property CookieIn: string read FCookieIn;
  154.   published
  155.     property OnPacketRecvd;
  156.     property OnPacketSent;
  157.     property Body: string read FBody write FBody;
  158.     property Header: string read FHeader write FHeader;
  159.     property HeaderInfo: THeaderInfo read FHeaderInfo write FHeaderInfo;
  160.     property InputFileMode: boolean read FInputFileMode write FInputFileMode;
  161.     property OutputFileMode: boolean read FOutputFileMode write FOutputFileMode;
  162.     property Proxy;
  163.     property ProxyPort;
  164.     property OnAboutToSend: TNotifyEvent read FOnAboutToSend write FOnAboutToSend;
  165.     property OnSuccess: TResultEvent read FOnSuccess write FOnSuccess;
  166.     property OnFailure: TResultEvent read FOnFailure write FOnFailure;
  167.     property OnRedirect: THandlerEvent read FOnRedirect write FOnRedirect;
  168.     property OnAuthenticationNeeded: TNotifyEvent read FOnAuthenticationNeeded write FOnAuthenticationNeeded;
  169.   end;
  170.   implementation
  171. uses
  172.   URLParse;
  173. {*******************************************************************************************
  174. Create HTTP component
  175. ********************************************************************************************}
  176. constructor TNMHTTP.Create(AOwner: TComponent);
  177. begin
  178.   inherited create(AOwner);
  179.   FHeaderInfo := THeaderInfo.create;
  180.   FSendHeader := TExStringList.create;
  181.   FEncodePosts := TRUE;
  182.   FHeader := sHTTP_Head_File; {Default Header File}
  183.   FBody := sHTTP_Body_File;
  184.   FInputFileMode := FALSE; {Inputs - File Mode}
  185.   FOutPutFileMode := FALSE; {Output - File Mode}
  186.   ProxyPort := 8080;
  187. end;
  188. destructor TNMHTTP.Destroy;
  189. begin
  190.   FHeaderInfo.free;
  191.   FSendHeader.free;
  192.   inherited destroy;
  193. end;
  194. {*******************************************************************************************
  195. Get Page given by URL
  196. ********************************************************************************************}
  197. procedure TNMHTTP.Get(URL: string);
  198. begin
  199.   ConnType := CmdGET; {Set transaction type to Get}
  200.   URL_Holder := URL; {Set Locator to URL for later}
  201.   HTTPConnect; {Get Page}
  202. end;
  203. {*******************************************************************************************
  204. Get Option given by URL
  205. ********************************************************************************************}
  206. procedure TNMHTTP.Options(URL: string);
  207. begin
  208.   URL_Holder := URL; {Set Locator to URL for later}
  209.   ConnType := CmdOPTIONS; {Set Connection type to get Options}
  210.   HTTPConnect; {Connect to web and get Options}
  211. end;
  212. {*******************************************************************************************
  213. Post File in FileName to given URL
  214. ********************************************************************************************}
  215. procedure TNMHTTP.Post(URL, PostData: string);
  216. begin
  217.   URL_Holder := URL; {Set Locator to URL for later}
  218.   (*
  219.     if FEncodePosts then
  220.       begin
  221.         NMURL1 := TNMURL.create(self);
  222.         try
  223.           if OutPutFileMode then
  224.             begin
  225.             end
  226.           else
  227.             begin
  228.               NMURL1.InputString := postData;
  229.               Postdata := NMURL1.Encode;
  230.             end;
  231.         finally
  232.           NMURL1.Free;
  233.         end;
  234.       end;
  235.   *)
  236.   TheSendFile := PostData; {Set the file to send to filename}
  237.   ConnType := CmdPOST; {Set Connection type to Post}
  238.   HTTPConnect; {Connect to web and post}
  239. end;
  240. {*******************************************************************************************
  241. Put File in FileName to given URL
  242. ********************************************************************************************}
  243. procedure TNMHTTP.Put(URL, PutData: string);
  244. begin
  245.   URL_Holder := URL; {Set Locator to URL for later}
  246.   TheSendFile := PutData; {Set the file to send to filename}
  247.   ConnType := CmdPUT; {Set Connection type to Put}
  248.   HTTPConnect; {Connect to web and put}
  249. end;
  250. {*******************************************************************************************
  251. Get Heading of given URL
  252. ********************************************************************************************}
  253. procedure TNMHTTP.Head(URL: string);
  254. begin
  255.   URL_Holder := URL; {Set Locator to URL for later}
  256.   ConnType := CmdHEAD; {Set Connection type to Head}
  257.   HTTPConnect; {Connect to web and get heading}
  258. end;
  259. {*******************************************************************************************
  260. Patch given URL with given file
  261. ********************************************************************************************}
  262. procedure TNMHTTP.Patch(URL, PatchData: string);
  263. begin
  264.   URL_Holder := URL; {Set Locator to URL for later}
  265.   TheSendFile := Patchdata; {Set the file to send to filename}
  266.   ConnType := CmdPATCH; {Set Connection type to Patch}
  267.   HTTPConnect; {Connect to web and patch}
  268. end;
  269. {*******************************************************************************************
  270. Copy URL1 to URL2
  271. ********************************************************************************************}
  272. procedure TNMHTTP.Copy(URL1, URL2: string);
  273. begin
  274.   URL_Holder := URL1; {Set Locator to URL for later}
  275.   TheDestURL := URL2; {Set theDestURL to be used later}
  276.   ConnType := CmdCOPY; {Set Connection type to COPY}
  277.   HTTPConnect; {Connect to web and copy}
  278. end;
  279. {*******************************************************************************************
  280. Move URL1 to URL2
  281. ********************************************************************************************}
  282. procedure TNMHTTP.Move(URL1, URL2: string);
  283. begin
  284.   URL_Holder := URL1; {Set Locator to URL for later}
  285.   TheDestURL := URL2; {Set theDestURL to be used later}
  286.   ConnType := CmdMOVE; {Set Connection type to MOVE}
  287.   HTTPConnect; {Connect to web and move}
  288. end;
  289. {*******************************************************************************************
  290. Link URL to Link
  291. ********************************************************************************************}
  292. procedure TNMHTTP.Link(URL, Link: string);
  293. begin
  294.   URL_Holder := URL; {Set Locator to URL for later}
  295.   TheDestURL := Link; {Set theDestURL to link later}
  296.   TheSendFile := sHTTP_Data_File; {Set the file to send to entity.stf}
  297.   ConnType := CmdLINK; {Set Connection type to LINK}
  298.   HTTPConnect; {Connect to web and link}
  299. end;
  300. {*******************************************************************************************
  301. UnLink URL from Link
  302. ********************************************************************************************}
  303. procedure TNMHTTP.UnLink(URL, Link: string);
  304. begin
  305.   URL_Holder := URL; {Set Locator to URL for later}
  306.   TheDestURL := Link; {Set theDestURL to link later}
  307.   TheSendFile := sHTTP_Data_File; {Set the file to send to entity.stf}
  308.   ConnType := CmdUNLINK; {Set Connection type to UNLINK}
  309.   HTTPConnect; {Connect to web and Unlink}
  310. end;
  311. {*******************************************************************************************
  312. Delete URL
  313. ********************************************************************************************}
  314. procedure TNMHTTP.Delete(URL: string);
  315. begin
  316.   URL_Holder := URL; {Set Locator to URL for later}
  317.   ConnType := CmdDELETE; {Set Connection type to DELETE}
  318.   HTTPConnect; {Connect to web and Delete}
  319. end;
  320. {*******************************************************************************************
  321. Request a trace from URL
  322. ********************************************************************************************}
  323. procedure TNMHTTP.Trace(URL, TraceData: string);
  324. begin
  325.   URL_Holder := URL; {Set Locator to URL for later}
  326.   TheSendFile := TraceData; {Set the file to send to entity.stf}
  327.   ConnType := CmdTRACE; {Set Connection type to TRACE}
  328.   HTTPConnect; {Connect to web and TRACE}
  329. end;
  330. {*******************************************************************************************
  331. Send Wrapped command to URL
  332. ********************************************************************************************}
  333. procedure TNMHTTP.Wrapped(URL, WrappedData: string);
  334. begin
  335.   URL_Holder := URL; {Set Locator to URL for later}
  336.   TheSendFile := WrappedData; {Set the file to send to entity.stf}
  337.   ConnType := CmdWRAPPED; {Set Connection type to TRACE}
  338.   HTTPConnect; {Connect to web and send WRAPPED}
  339. end;
  340. {*******************************************************************************************
  341. Abort transaction
  342. ********************************************************************************************}
  343. procedure TNMHTTP.Abort;
  344. begin
  345.   Wait_Flag := TRUE; {Force fetch to come out of wait loop}
  346.   cancel; {Set Flag to cancel present transaction}
  347. end;
  348. procedure TNMHTTP.PostStream(URL: string; Stream: TStream);
  349. begin
  350.   URL_Holder := URL; {Set Locator to URL for later}
  351.   FSendStream := Stream; {Set the file to send to filename}
  352.   ConnType := CmdPOSTS; {Set Connection type to Post}
  353.   HTTPConnect; {Connect to web and post}
  354. end;
  355. {*******************************************************************************************
  356. Carry out HTTP transaction
  357. ********************************************************************************************}
  358. procedure TNMHTTP.HTTPConnect;
  359. var
  360.   Handled: boolean;
  361.   LkHead: string;
  362.   tmp: string;
  363. begin
  364.   repeat
  365.     //ParsetheURL;                                   {Parse the URL to get Host, Port and Selector}
  366.     ParseURL(URL_Holder, FScheme, FUser, FPassword, FNetworkLocation, FPort, FPath, FResource, FParameters, FQuery, FFragment);
  367.     if (FUser <> '') or (FPassword <> '') then
  368.       HeaderInfo.FUserId := FUser;
  369.     HeaderInfo.FPassword := FPassword;
  370.     Port := StrToInt(DefaultPort(FScheme));
  371.     Host := FNetworkLocation;
  372.     AssembleHTTPHeader;
  373.     if assigned(FOnAboutToSend) then
  374.       FOnAboutToSend(self);
  375.     try
  376.       Connect; {Now connect to  Host at Port}
  377.       SendHTTP;
  378.       FReplyNumber := 0;
  379.       timeron;
  380.       try
  381.         while (FifoQ.BufferSize < 3) and (not beenCanceled) do
  382.           wait;
  383.       finally
  384.         timeroff;
  385.       end;
  386.       if Timedout then
  387.         raise ESockError.Create('Timed out waiting for response');
  388.       if BeenCanceled then
  389.         raise ESockError.Create('Wait for response Cancelled');
  390.       Setlength(LkHead, 3);
  391.       FifoQ.Peek(Pointer(@LkHead[1]), 3);
  392.       if (LKHead = 'HTT') then
  393.         RemoveHeader; {Get the Header of the file sent from host}
  394.       if InputFileMode then
  395.         CaptureFile(FBody) {Capture the body of the data from host}
  396.       else
  397.         CaptureString(FBody, -2);
  398.       if ReplyNumber < 299 then
  399.         begin
  400.           if Assigned(FOnSuccess) then
  401.             FOnSuccess(ConnType); {If a  message received event handler present execute it}
  402.           StatusMessage(STATUS_BASIC, sHTTP_Msg_Trans); {Show status Message}
  403.         end
  404.       else if ReplyNumber > 399 then
  405.         begin
  406.           if Assigned(FOnFailure) then
  407.             FOnFailure(ConnType)
  408.         end
  409.       else if (ReplyNumber >= 300) and (ReplyNumber <= 302) then
  410.         URL_Holder := FLocation;
  411.     finally
  412.       CloseImmediate;
  413.       FConnected := TRUE;
  414.       Disconnect; {Disconnect from host}
  415.     end;
  416.     if (ReplyNumber > 299) and (ReplyNumber < 399) then
  417.       begin
  418.         Handled := FALSE;
  419.         if CookieIn <> '' then
  420.           HeaderInfo.Cookie := CookieIn;
  421.         if assigned(OnRedirect) then
  422.           OnRedirect(Handled);
  423.         if Handled then
  424.           break;
  425.         ConnType := CmdGET; {Set transaction type to Get}
  426.         if Pos('//', URL_Holder) = 0 then
  427.           if Pos('/', URL_Holder) <> 1 then
  428.             begin
  429.               tmp := URL_Holder;
  430.               URL_Holder := FScheme + '//' + FNetworkLocation;
  431.               if FPort <> '' then
  432.                 URL_Holder := URL_Holder + FPort;
  433.               URL_Holder := URL_Holder + FPath + tmp;
  434.             end;
  435.             //URL_Holder := 'http://' + Host + '/' + URL_Holder;
  436.       end;
  437.     if (ReplyNumber = 401) then
  438.       if assigned(FOnAuthenticationNeeded) then
  439.         FOnAuthenticationNeeded(self);
  440.   until (ReplyNumber < 299) or (ReplyNumber > 399);
  441. end;
  442. (*
  443. {*******************************************************************************************
  444. Parse the URL
  445. ********************************************************************************************}
  446. procedure TNMHTTP.ParsetheURL;
  447. var
  448.   Pos1                : integer;
  449.   TempStr             : string;
  450. begin
  451.   if URL_Holder = '' then {Nothing to work on?}
  452.     raise Exception.create( sHTTP_Cont_Msg_NoURL );
  453.   if port = 0 then {Set default port}
  454.     Port := 80;
  455.   if Pos( '//', URL_Holder ) <> 0 then
  456.     FSelector := system.Copy( URL_Holder, NthPos( URL_Holder, '/', 3 ), 256 )
  457.   else if Pos( '/', URL_Holder ) <> 0 then
  458.     FSelector := system.Copy( URL_Holder, Pos( '/', URL_Holder ), 256 )
  459.   else
  460.     Fselector := '';
  461.   if Pos( ':', URL_Holder ) <> 0 then
  462.     begin
  463.       tempStr := LowerCase( NthWord( URL_Holder, ':', 1 ) ); {Extract URL type}
  464.       if TempStr = Prt_gopher then
  465.         Port := 70                              {If URL Type is gopher set port to 70}
  466.       else if TempStr = Prt_ftp then
  467.         Port := 21
  468.       else if TempStr = 'https' then
  469.         raise exception.create( 'HTTP Secure Socket is not supported' )
  470.       else
  471.         Port := 80;                             {If URL type is FTP set FPort to 21 else set port to 80}
  472.     end;
  473.   if Pos( '//', URL_Holder ) <> 0 then
  474.     tempStr := NthWord( URL_Holder, '/', 3 )    {Extract Host part}
  475.   else if URL_Holder[ 1 ] <> '/' then
  476.     tempStr := NthWord( URL_Holder, '/', 1 )
  477.   else
  478.     tempstr := '';                              {Extract Host part}
  479.   Pos1 := Pos( ':', tempStr );                  {see if a colon in host address}
  480.   if Pos1 > 0 then
  481.     {if so there is an embedded port number}
  482.     begin
  483.       Port := StrToInt( NthWord( tempStr, ':', 2 ) ); {If so extract port}
  484.       system.Delete( tempStr, Pos1, 255 );      {and extract remaining IPAddr}
  485.     end;
  486.   if tempStr <> '' then
  487.     Host := tempStr;
  488.   if FSelector = '' then {If no seletor(directory) make it the home directory}
  489.     begin FSelector := '/';
  490.       URL_Holder := URL_Holder + '/';
  491.     end;
  492. end;
  493. *)
  494. {*******************************************************************************************
  495. Send HTTP Header
  496. ********************************************************************************************}
  497. procedure TNMHTTP.AssembleHTTPHeader;
  498. var
  499.   strm: TFileStream;
  500.   Ins, Ous: TStringStream;
  501.   NMUUProcessor1: TNMUUProcessor;
  502.   tmp: string;
  503.   i: PChar;
  504. begin
  505.   FSendHeader.clear; {Create memorystream to hold Http command}
  506.   try
  507.     case ConnType of
  508.       {Construct the command line depending on type of Transaction}
  509.       CmdGET:
  510.         tmp := Cmd_Get;
  511.       CmdOPTIONS:
  512.         tmp := Cmd_Options;
  513.       CmdPOST, CmdPOSTS:
  514.         tmp := Cmd_Post;
  515.       CmdPUT:
  516.         tmp := Cmd_Put;
  517.       CmdHEAD:
  518.         tmp := Cmd_Head;
  519.       CmdPATCH:
  520.         tmp := Cmd_Patch;
  521.       CmdCOPY:
  522.         tmp := Cmd_Copy;
  523.       CmdMOVE:
  524.         tmp := Cmd_Move;
  525.       CmdLINK:
  526.         tmp := Cmd_Link;
  527.       CmdUNLINK:
  528.         tmp := Cmd_Unlink;
  529.       CmdDELETE:
  530.         tmp := Cmd_Delete;
  531.       CmdTRACE:
  532.         tmp := Cmd_Trace;
  533.     end;
  534.     if Proxy <> '' then
  535.       begin
  536.         i := StrPos(PChar(URL_Holder), ' ');
  537.         while i <> nil do
  538.           begin
  539.             I^ := '+';
  540.             i := StrPos(PChar(URL_Holder), ' ');
  541.           end;
  542.         {If Proxy server send whole URL}
  543.         FsendHeader.add(tmp + URL_Holder + Prt_str_http);
  544.         FsendHeader.add(Prox_Head_Str); {If Proxy ask connection to be kept alive}
  545.         FsendHeader.add(Prox_Host_Str + Host); {Send host name to proxy}
  546.       end
  547.     else
  548.       begin
  549.         FSelector := FPath + FResource + FParameters + FQuery + FFragment;
  550.         i := StrPos(PChar(FSelector), ' ');
  551.         while i <> nil do
  552.           begin
  553.             I^ := '+';
  554.             i := StrPos(PChar(FSelector), ' ');
  555.           end;
  556.         {If no proxy just send selector}
  557.         FsendHeader.add(tmp + FSelector + Prt_str_http);
  558.       end;
  559.     {Send acceptable reply types}
  560.     FsendHeader.values[Head_Host] := Host;
  561.     FsendHeader.add(Host_Accpt_Str1);
  562.     FsendHeader.add(Host_Accpt_Str2);
  563.     if FHeaderInfo.FLocalAddress <> '' then
  564.       FsendHeader.values[Host_UserAgent] := FHeaderInfo.FLocalAddress;
  565.     if FHeaderInfo.FLocalProgram <> '' then
  566.       FsendHeader.values[Head_From] := FHeaderInfo.FLocalProgram;
  567.     if FHeaderInfo.FCookie <> '' then
  568.       FsendHeader.values[Head_Cookie] := FHeaderInfo.FCookie;
  569.     if FHeaderInfo.FReferer <> '' then
  570.       FsendHeader.values[Head_Referer] := FHeaderInfo.FReferer;
  571.     if (FHeaderInfo.FUserId <> '') and (FHeaderInfo.Fpassword <> '') then
  572.       begin
  573.         Ins := TStringStream.create(FHeaderInfo.FUserId + ':' + FHeaderInfo.Fpassword);
  574.         Ous := TStringStream.create('');
  575.         NMUUProcessor1 := TNMUUProcessor.create(self);
  576.         try
  577.           NMUUProcessor1.InputStream := Ins;
  578.           NMUUProcessor1.OutputStream := Ous;
  579.           NMUUProcessor1.method := UUMime;
  580.           NMUUProcessor1.Encode;
  581.           FsendHeader.values['Authorization'] := 'Basic ' + Ous.DataString;
  582.         finally
  583.           NMUUProcessor1.free;
  584.           Ous.free;
  585.           Ins.free;
  586.         end;
  587.       end;
  588.     if (FHeaderInfo.FProxyUserId <> '') and (FHeaderInfo.FProxyPassword <> '') then
  589.       begin
  590.         Ins := TStringStream.create(FHeaderInfo.FProxyUserId + ':' + FHeaderInfo.FProxyPassword);
  591.         Ous := TStringStream.create('');
  592.         NMUUProcessor1 := TNMUUProcessor.create(self);
  593.         try
  594.           NMUUProcessor1.InputStream := Ins;
  595.           NMUUProcessor1.OutputStream := Ous;
  596.           NMUUProcessor1.method := UUMime;
  597.           NMUUProcessor1.Encode;
  598.           FsendHeader.values['Proxy-Authorization'] := 'Basic ' + Ous.DataString;
  599.         finally
  600.           NMUUProcessor1.free;
  601.           Ous.free;
  602.           Ins.free;
  603.         end;
  604.       end;
  605.     FsendHeader.add(Head_Content); {Send content type of request}
  606.     case ConnType of
  607.       CmdLINK, CmdUNLINK:
  608.         FsendHeader.add(Head_Link + TheDestURL); {Send link for link or unlink method}
  609.       CmdMOVE, CmdCOPY:
  610.         FsendHeader.add(Head_URI + TheDestURL); {Send destination URL for copy or move methods}
  611.     end;
  612.     case ConnType of
  613.       {Construct the content length string}
  614.       CmdPOSTS:
  615.         FSendHeader.add(Head_ContentLength + IntToStr(FSendStream.size));
  616.       CmdPOST, CmdPUT, CmdPATCH, CmdTRACE, CmdWRAPPED, CmdLINK, CmdUNLINK:
  617.         begin
  618.           if OutPutFileMode then
  619.             begin
  620.               strm := TFileStream.Create(TheSendFile, fmOpenRead); {Open stream}
  621.               try
  622.                 FsendHeader.add(Head_ContentLength + IntToStr(strm.size)); {Send content length of stream}
  623.               finally
  624.                 strm.destroy; {Destroy stream}
  625.               end;
  626.             end
  627.           else
  628.             FsendHeader.add(Head_ContentLength + IntToStr(length(TheSendFile)));
  629.         end;
  630.     end;
  631.   finally
  632.   end
  633. end;
  634. procedure TNMHTTP.SendHTTP;
  635. begin
  636.   write(FsendHeader.text);
  637.   writeln('');
  638.   case ConnType of
  639.     CmdPOSTS:
  640.       SendStream(FSendStream);
  641.     CmdPOST, CmdPUT, CmdPATCH, CmdTRACE, CmdWRAPPED:
  642.       if OutputFileMode then
  643.         SendFile(TheSendFile)
  644.       else
  645.         write(TheSendFile);
  646.   end;
  647. end;
  648. procedure TNMHTTP.RemoveHeader;
  649. var
  650.   strm: TFileStream;
  651.   ReplyMess, tempbuff, temp2: string;
  652.   i: integer;
  653.   st: boolean;
  654. begin
  655.   strm := nil;
  656.   FBytesTotal := 0;
  657.   FCookieIn := '';
  658.   if InPutFileMode then
  659.     strm := TFileStream.Create(Header, fmCreate) {Create stream to take header}
  660.   else
  661.     FHeader := '';
  662.   try
  663.     ReplyMess := Readln;
  664.     if ReplyMess <> '' then
  665.       FReplyNumber := StrtoIntDef(NthWord(ReplyMess, ' ', 2), 0);
  666.     if InPutFileMode then
  667.       strm.WriteBuffer(ReplyMess[1], Length(ReplyMess)) {Write it to buffer}
  668.     else
  669.       FHeader := FHeader + ReplyMess;
  670.     repeat
  671.       ReplyMess := Readln;
  672.       tempbuff := uppercase(ReplyMess); {Read a line}
  673.       if NthWord(tempbuff, ' ', 1) = Head_SetCookie then
  674.         begin
  675.           if Pos(';', ReplyMess) > 0 then FCookieIn := system.Copy(ReplyMess, 13, Pos(';', ReplyMess) - 13)
  676.           else FCookieIn := system.Copy(ReplyMess, 13, Length(ReplyMess) - 14);
  677.         end;
  678.       if NthWord(tempbuff, ' ', 1) = Head_Location then
  679.         begin
  680.           FLocation := system.Copy(ReplyMess, 11, 256);
  681.           SetLength(FLocation, Length(FLocation) - 2);
  682.         end;
  683.       if NthWord(tempbuff, ' ', 1) = Head_CL2 then
  684.         begin
  685.           system.Delete(tempbuff, 1, pos(Head_length, tempbuff) + 6); {Delete anything before 'length:'}
  686.           st := FALSE;
  687.           temp2 := '';
  688.           for i := 1 to length(tempbuff) do
  689.             if st = TRUE then
  690.               if ((tempbuff[i] < '0') or (tempbuff[i] > '9')) then
  691.                 break
  692.               else
  693.                 temp2 := temp2 + tempbuff[i]
  694.             else if ((tempbuff[i] >= '0') or (tempbuff[i] <= '9')) then
  695.               begin
  696.                 temp2 := temp2 + tempbuff[i];
  697.                 st := TRUE;
  698.               end;
  699.           FBytesTotal := StrToIntDef(temp2, 0);
  700.         end;
  701.       if InPutFileMode then
  702.         strm.WriteBuffer(ReplyMess[1], Length(ReplyMess)) {Write it to buffer}
  703.       else
  704.         FHeader := FHeader + ReplyMess;
  705.     until (ReplyMess = #10) or (ReplyMess = #13#10) or (ReplyMess = ''); {Until blank line}
  706.   finally
  707.     if InPutFileMode then
  708.       strm.free;
  709.   end;
  710. end;
  711. end.