1,593
社区成员
发帖
与我相关
我的任务
分享
function HttpRequest(
const AURL : string;
const AAddress : string;
const ARedirect : Boolean;
var AStatus : Integer;
var AResultStream : TMemoryStream;
const AHeader : TStrings = nil
):Boolean;
var
hSession, hConnect, hRequest: hInternet;
HostName : string;
Address : string;
FileName : String;
Buf: Pointer;
dwBufLen, dwIndex: DWord;
Data: Array[0..READ_LENGTH - 1] of Char;
InternetFlag: DWord;
BytesReaded: Integer;
BytesToRead: cardinal;
AcceptTypes : array[0..1] of PChar;
Header : string;
procedure ParseURL(URL: String; var HostName, FileName: String);
var
i: Integer;
begin
if Pos('http://', LowerCase(URL)) <> 0 then
Delete(URL, 1, 7);
i := Pos('/', URL);
HostName := Copy(URL, 1, i);
FileName := Copy(URL, i, Length(URL) - i + 1);
if (Length(HostName) > 0) and (HostName[Length(HostName)] = '/') then
SetLength(HostName, Length(HostName) - 1);
end;
procedure AddHeader(const AStr : string);
begin
HttpAddRequestHeaders(
hRequest,
PChar(AStr),
Length(AStr),
1
);
end;
procedure CloseHandles;
begin
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hSession);
end;
begin
ParseURL(AURL, HostName, FileName);
Address := AAddress;
if Address = '' then
Address := HostName;
hSession := InternetOpen(
nil,
INTERNET_OPEN_TYPE_PRECONFIG,
nil,
nil,
0
);
hConnect := InternetConnect(
hSession,
PChar(Address),
INTERNET_DEFAULT_HTTP_PORT,
nil,
nil,
INTERNET_SERVICE_HTTP,
0,
0
);
InternetFlag := INTERNET_FLAG_RELOAD;// or INTERNET_FLAG_NO_AUTO_REDIRECT;
if not ARedirect then
InternetFlag := InternetFlag or INTERNET_FLAG_NO_AUTO_REDIRECT;
AcceptTypes[0] := '*.*';
AcceptTypes[1] := nil;
hRequest := HttpOpenRequest(
hConnect,
'GET',
PChar(FileName),
'HTTP/1.1',
PChar(AURL),
nil,//@AcceptTypes,
InternetFlag,
0
);
AddHeader('host: ' + HostName);
AddHeader('Accept: */*');
AddHeader('Accept-Language: zh-cn');
AddHeader('Accept-Encoding: gzip, deflate');
AddHeader('User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)');
AddHeader('Connection: Keep-Alive');
HttpSendRequest(
hRequest,
nil,//PChar(Header),
0,//Length(Header),
nil,
0
);
dwIndex := 0;
dwBufLen := 1024;
GetMem(Buf, dwBufLen);
try
Result := HttpQueryInfo(
hRequest,
HTTP_QUERY_STATUS_CODE,
Buf,
dwBufLen,
dwIndex
);
AStatus := StrToIntDef(StrPas(PChar(Buf)), 0);
finally
FreeMem(Buf);
end;
if Assigned(AResultStream) then
AResultStream.Clear;
if Result then
begin
BytesReaded := 0;
if AResultStream = nil then
AResultStream := TMemoryStream.Create;
while True do
begin
if not InternetReadFile(
hRequest,
@Data,
SizeOf(Data),
BytesToRead
) then
Break
else if BytesToRead = 0 then
Break
else begin
AResultStream.Write(Data[0], BytesToRead);
inc(BytesReaded, BytesToRead);
end;
end;
Result := BytesReaded <> 0;
end;
CloseHandles;
end;