📄 unthttpconnection.pas
字号:
unit untHttpConnection;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPServer, StdCtrls,winsock,
ComCtrls, ExtCtrls,untHttpHeaderObj;
type
TMyHttpData = class
public
dataHttpHeader:String;
dataHttpContent:String;
end;
const GetMethod = 12548;
const PostMethod = 15467;
function getHttpData(Server:String;Port:integer;Url:String;var CookieVal:TStringList;Method:integer = GetMethod;RequestData:String=''):TMyHttpData;
function getHttpDataByGetMethod(Server:String;Port:integer;Url:String;var CookieVal:TStringList):String;
function getHttpDataByPostMethod(Server:String;Port:integer;Url:String;var CookieVal:TStringList;RequestData:String):String;
implementation
function getHttpData(Server:String;Port:integer;Url:String;var CookieVal:TStringList;Method:integer = GetMethod;RequestData:String=''):TMyHttpData;
var
PageData:String;
i:integer;
begin
Result := TMyHttpData.Create;
PageData := '';
if Method = GetMethod then
PageData := getHttpDataByGetMethod(Server,Port,Url,CookieVal)
else
PageData := getHttpDataByPostMethod(Server,Port,Url,CookieVal,RequestData);
i := pos(#13#10#13#10,PageData);
if i>0 then
begin
Result.dataHttpHeader := Copy(PageData,1,i);
Result.dataHttpContent := Copy(PageData,i+4,Length(PageData)-i+4+1);
end
else begin
Result.dataHttpHeader := '';
Result.dataHttpContent := '';
end;
end;
function getHttpDataByGetMethod(Server:String;Port:integer;Url:String;var CookieVal:TStringList):String;
var
len,s:integer;
name:sockaddr_in;
he:PHostEnt;
buf:array[0..1023]of char;
str,data:string;
wsd:WSADATA;
i:integer;
begin
WSAStartup($101,wsd);
s:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
he:=gethostbyname(PChar(Server));
if he=nil then
Raise Exception.Create('使用Sock连接异常或是指定服务器有误!');
FillChar(name,sizeof(name),0);
name.sin_family:=AF_INET;
name.sin_port:=htons(Port);
name.sin_addr.S_addr:=PDWORD(PDWORD(he.h_addr)^)^;
connect(s,name,sizeof(name));
str := 'GET /'+ Url +' HTTP/1.1'#13#10;
str := str + 'Referer: http://' + Server;
if Port<>80 then
str := str + ':' + IntToStr(Port);
str := str + '/' + Url + #13#10;
str := str + 'User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)'#13#10;
str := str + 'Host: ' + Server;
if Port<>80 then
str := str + ':' + IntToStr(Port);
str := str + ''#13#10;
str := str + 'Connection: Close'#13#10;
str := str + 'Cache-Control: no-cache'#13#10;
for i := 0 to CookieVal.Count-1 do
begin
str := str + 'Cookie: '+ CookieVal.Strings[i] + #13#10;
end;
str := str + #13#10;
send(s,PChar(str)^,Length(str),0);
while true do
begin
len:=recv(s,buf,sizeof(buf),0);
if len<1 then
break;
SetString(str,buf,len);
data:=data+str;
end;
closesocket(s);
WSACleanup();
Result := data;
end;
function getHttpDataByPostMethod(Server:String;Port:integer;Url:String;var CookieVal:TStringList;RequestData:String):String;
var
len,s:integer;
name:sockaddr_in;
he:PHostEnt;
buf:array[0..1023]of char;
str,data:string;
wsd:WSADATA;
i:integer;
begin
WSAStartup($101,wsd);
s:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
he:=gethostbyname(PChar(Server));
if he=nil then
Raise Exception.Create('使用Sock连接异常或是指定服务器有误!');
FillChar(name,sizeof(name),0);
name.sin_family:=AF_INET;
name.sin_port:=htons(Port);
name.sin_addr.S_addr:=PDWORD(PDWORD(he.h_addr)^)^;
connect(s,name,sizeof(name));
str := 'POST /'+ Url +' HTTP/1.1'#13#10;
str := str + 'Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword */*'#13#10;
str := str + 'Referer: http://' + Server;
if Port<>80 then
str := str + ':' + IntToStr(Port);
str := str + '/' + Url + #13#10;
str := str + 'Accept-Language: zh-cn'#13#10;
str := str + 'Content-Type: application/x-www-form-urlencoded..Accept-Encoding: gzip, deflate'#13#10;
str := str + 'User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)'#13#10;
str := str + 'Host: ' + Server;
if Port<>80 then
str := str + ':' + IntToStr(Port);
str := str + ''#13#10;
str := str + 'Content-Length: ' + IntToStr(Length(RequestData)) + #13#10;
str := str + 'Connection: Keep-Alive'#13#10;
for i := 0 to CookieVal.Count-1 do
begin
str := str + 'Cookie: '+ CookieVal.Strings[i] + #13#10;
end;
str := str + 'Cache-Control: no-cache'#13#10#13#10;
str := str + RequestData + #13#10#13#10;
str := str + #13#10;
send(s,PChar(str)^,Length(str),0);
while true do
begin
len:=recv(s,buf,sizeof(buf),0);
if len<1 then
break;
SetString(str,buf,len);
data:=data+str;
end;
closesocket(s);
WSACleanup();
Result := data;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -