Type
THTTPHead = (nHead, nGet, nPost);
PWebHead = ^TWebHead;
TWebHead = Record
uCode :Word;
szSer :Array [0..64] Of AnsiChar;
End;
PDomain = ^TDomain;
TDomain = Record
szUrl :Array [0..255] Of AnsiChar;
szHost :Array [0..255] Of AnsiChar;
szFile :Array [0..255] Of AnsiChar;
bSSL :Boolean;
nPort :Word;
End;
Const
UserAgent:PAnsiChar = 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko';
Header :PAnsiChar = 'Content-Type: application/x-www-form-urlencoded'#13#10#$0;
Function StrStrIA(lpFirst, lpSrch: PAnsiChar): PAnsiChar; stdcall; external 'shlwapi.dll' name 'StrStrIA';
Function StrNCatA(lpFirst, lpSrch:PAnsiChar; cchMax:Integer): PAnsiChar; stdcall; external 'shlwapi.dll' name 'StrNCatA';
Function StrToIntA(lpSrch: PAnsiChar): Integer; stdcall; external 'shlwapi.dll' name 'StrToIntA';
Function StrPosA(lpSrch, lpFirst:PAnsiChar):Integer;
Var
Cmp :PAnsiChar;
begin
Result := 0;
if (lpSrch = Nil) Or (lpFirst = Nil) then Exit;
if DWORD(lpSrch) = DWORD(lpFirst) then
begin
Result := 1;
Exit;
end;
Cmp := StrStrIA(lpFirst, lpSrch);
if Cmp <> Nil then
begin
Result := DWORD(Cmp) - DWORD(lpFirst) + 1;
end;
end;
Procedure DeleteA(lpszStr:PAnsiChar; Index, Count:Integer);
Var
uSize :Integer;
begin
uSize := lstrlenA(lpszStr);
if uSize = Count then
begin
lstrcpyA(@lpszStr[index - 1], @lpszStr[Index + Count -1]);
ZeroMemory(@lpszStr[index -1], Index + Count);
end else begin
lpszStr[Index - 1] := #0;
StrNCatA(lpszStr, @lpszStr[Index + Count - 1], uSize);
end;
end;
Function CopyA(lpszStr:PAnsiChar; Index, Count:Integer):PAnsiChar;
begin
Result := GetMemory(Count - Index + 1);
lstrcpynA(Result, @lpszStr[Index -1], Count);
end;
Function ParseURL(szUrl:PAnsiChar):PDomain;
Var
nSize :DWORD;
szSeek :PAnsiChar;
szCmp :PAnsiChar;
begin
Result := GetMemory(SizeOf(TDomain));
ZeroMemory(Result, SizeOf(TDomain));
if StrStrIA(szUrl, 's://') <> Nil then Result^.bSSL := True;
nSize := StrPosA('://', szUrl);
if nSize > 0 then
begin
szSeek := @szUrl[nSize + 2];
lstrcpyA(@Result^.szUrl, szUrl);
end else
begin
szSeek := szUrl;
lstrcpyA(@Result^.szUrl, 'http://');
lstrcatA(@Result^.szUrl, szUrl);
end;
nSize := StrPosA(':', szSeek);
if nSize > 0 then
begin
lstrcpynA(@Result^.szHost, szSeek, nSize);
szSeek := @szSeek[nSize];
nSize := StrPosA('/', szSeek);
if nSize > 0 then
begin
lstrcpynA(@Result^.szFile, szSeek, nSize);
Result^.nPort := StrToIntA(Result^.szFile);
ZeroMemory(@Result^.szFile, 256);
szSeek := @szSeek[nSize - 1];
end;
end Else
begin
nSize := StrPosA('/', szSeek);
if nSize > 0 then lstrcpynA(@Result^.szHost, szSeek, nSize) Else lstrcpyA(@Result^.szHost, szSeek);
szCmp := StrStrIA(szUrl, 's://');
if szCmp <> Nil then
begin
nSize := DWORD(szCmp) - DWORD(szUrl);
if nSize > 0 then Result^.nPort := 443;
End Else Result^.nPort := 80;
end;
nSize := StrPosA('/', szSeek);
if nSize > 0 then lstrcpynA(@Result^.szFile, @szSeek[nSize], 255);
if lstrlenA(@Result^.szFile) = 0 then lstrcpyA(@Result^.szFile, '/');
end;
Function GetCode(szHead:PAnsiChar):Integer;
Var
szSeek :PAnsiChar;
uRet :Integer;
begin
Result := 0;
szSeek := szHead;
uRet := StrPosA(' ', szSeek);
if uRet > 0 then
begin
Inc(szSeek, uRet);
uRet := StrPosA(' ', szSeek);
if uRet > 0 then
begin
szSeek[uRet-1] := #$0;
Result := StrToIntA(szSeek);
szSeek[uRet-1] := ' ';
end;
end;
end;
Function GetWebSer(szHead:PAnsiChar):PAnsiChar;
Var
szSeek :PAnsiChar;
uRet :Integer;
begin
Result := Nil;
szSeek := szHead;
uRet := StrPosA('Server:', szSeek);
if uRet > 0 then
begin
Inc(szSeek, uRet + 7);
uRet := StrPosA(#13, szSeek)-1;
if uRet > 0 then
begin
szSeek[uRet] := #$0;
Result := GetMemory(lstrlenA(szSeek) + 6);
lstrcpyA(Result, szSeek);
szSeek[uRet] := #13;
end;
end;
end;
Function GetPowered(szHead:PAnsiChar):PAnsiChar;
Var
szSeek :PAnsiChar;
uRet :Integer;
begin
Result := Nil;
szSeek := szHead;
uRet := StrPosA('x-powered-by:', szSeek);
if uRet > 0 then
begin
Inc(szSeek, uRet + 13);
uRet := StrPosA(#13, szSeek)-1;
if uRet > 0 then
begin
szSeek[uRet] := #$0;
Result := GetMemory(lstrlenA(szSeek) + 6);
lstrcpyA(Result, szSeek);
szSeek[uRet] := #13;
end;
end;
end;
Function HTTP_Exec(lpHead:THTTPHead; szUrl:PAnsiChar; Data:Pointer; dSize:DWORD; Cookies:PAnsiChar; Var uCode:DWORD):PByte;
Const
IntBufSize = 8192;
Var
Session :HINTERNET;
Connect :HINTERNET;
Resource :HINTERNET;
dwFlags :DWORD;
Buffer :Array[0..IntBufSize-1] of AnsiChar;
uSize :DWORD;
uRecv :DWORD;
dwDomain :PDomain;
Stream :TMemoryStream;
begin
Result := Nil;
uCode := 0;
Stream := TMemoryStream.Create;
dwDomain := ParseURL(szUrl);
if dwDomain = Nil then Exit;
if dwDomain^.bSSL then dwFlags := INTERNET_FLAG_SECURE Else dwFlags := 0;
if Cookies <> Nil then InternetSetCookieA(szUrl, Nil, Cookies);
Session := InternetOpenA(UserAgent, INTERNET_OPEN_TYPE_PRECONFIG, Nil, Nil, 0);
if Session <> Nil then
begin
Connect := InternetConnectA(Session, @dwDomain^.szHost, dwDomain^.nPort, Nil, Nil, INTERNET_SERVICE_HTTP, 0, 0);
if Connect <> Nil then
begin
case lpHead of
nHead :
begin
Resource := HttpOpenRequestA(Connect, 'HEAD', @dwDomain^.szFile, Nil, Nil, Nil, dwFlags Or INTERNET_FLAG_NO_CACHE_WRITE Or INTERNET_FLAG_RELOAD, 0);
if Resource <> Nil then
begin
if HttpSendRequestA(Resource, Nil, 0, Nil, 0) then
begin
uSize := SizeOf(Buffer);
ZeroMemory(@Buffer, uSize);
uRecv := 0;
if HttpQueryInfoA(Resource, HTTP_QUERY_RAW_HEADERS_CRLF, @Buffer, uSize, uRecv) then
begin
Stream.WriteBuffer(Buffer, lstrlenA(@Buffer));
uCode := GetCode(@Buffer);
end;
end;
end;
end;
nGet :
begin
Resource := HttpOpenRequestA(Connect, 'GET', @dwDomain^.szFile, Nil, Nil, Nil, dwFlags Or INTERNET_FLAG_NO_CACHE_WRITE Or INTERNET_FLAG_RELOAD, 0);
if Resource <> Nil then
begin
if HttpSendRequestA(Resource, Nil, 0, Nil, 0) then
begin
uSize := SizeOf(DWORD);
uRecv := 0;
if HttpQueryInfoA(Resource, HTTP_QUERY_STATUS_CODE Or HTTP_QUERY_FLAG_NUMBER, @uCode, uSize, uRecv) then
begin
repeat
if InternetReadFile(Resource, @Buffer, IntBufSize, uRecv) then
begin
Stream.WriteBuffer(Buffer, uRecv);
end;
until uRecv = 0;
end;
end;
end;
end;
nPost :
begin
Resource := HttpOpenRequestA(Connect, 'POST', @dwDomain^.szFile, Nil, Nil, Nil, dwFlags Or INTERNET_FLAG_NO_CACHE_WRITE Or INTERNET_FLAG_RELOAD, 0);
if Resource <> Nil then
begin
If HttpAddRequestHeadersA(Resource, Header, lstrlenA(Header), dwFlags Or HTTP_ADDREQ_FLAG_ADD Or HTTP_ADDREQ_FLAG_REPLACE) Then
begin
if HttpSendRequestA(Resource, Nil, 0, Data, dSize) then
begin
uSize := SizeOf(DWORD);
uRecv := 0;
if HttpQueryInfoA(Resource, HTTP_QUERY_STATUS_CODE Or HTTP_QUERY_FLAG_NUMBER, @uCode, uSize, uRecv) then
begin
repeat
if InternetReadFile(Resource, @Buffer, IntBufSize, uRecv) then
begin
Stream.WriteBuffer(Buffer, uRecv);
end;
until uRecv = 0;
end;
end;
end;
end;
end;
end;
InternetCloseHandle(Connect);
end;
InternetCloseHandle(Session);
end;
if Stream.Size > 0 then
begin
Result := GetMemory(Stream.Size);
CopyMemory(Result, Stream.Memory, Stream.Size);
end;
Stream.Free;
end;