Post запрос WinInet
От: Happy  
Дата: 16.12.07 19:10
Оценка:
Доброго времени суток!
Есть код отправляющий локальный файл пост запросом на скрипт:
program fileposter;

uses
    windows,
    winsock2;

function Int(i:integer):pchar;
var s:array [0..255] of char;
begin
s:=#0;
system.str(i,s);
result:=@s;
end;

function Send_Needed(Host, LocalFile: PChar):boolean;
var
answer:array [0..1023]  of char;
piece: array [0..3071] of char;
SockAddrIn: TSockAddrIn;                     
HostEnt: PHostEnt;
WSAData: TWSAData;
s:integer;
Str,Data,FormSize:pchar;
LogBuff:pointer;
Log,Size,BytesReaded,BufferUsed,Bytes:dword;
URL: string;
begin
result:=false;
WSAStartup($202, WSAData);
s:=WSASocketA(PF_INET, SOCK_STREAM, IPPROTO_TCP, nil, 0, 0);
SockAddrIn.sin_family := PF_INET;
SockAddrIn.sin_port := htons(80);
SockAddrIn.sin_addr.s_addr :=inet_addr(Host);
if SockAddrIn.sin_addr.s_addr = INADDR_NONE then
begin
HostEnt := gethostbyname(Host);
if HostEnt = nil then Exit;
SockAddrIn.sin_addr.s_addr := Longint(PLongint(HostEnt^.h_addr_list^)^);
end;
if Connect(s, @SockAddrIn, SizeOf(SockAddrIn))=SOCKET_ERROR then Exit;
Log:= CreateFile(LocalFile, GENERIC_READ, FILE_SHARE_READ,nil,OPEN_EXISTING,FILE_ATTRIBUTE_SYSTEM+FILE_ATTRIBUTE_HIDDEN,0);
Size:=GetFileSize(Log,nil);
LogBuff:=virtualalloc(nil,Size,MEM_COMMIT or MEM_RESERVE,PAGE_READWRITE);
SetFilePointer(Log,0,nil,FILE_BEGIN);
ReadFile(log,LogBuff^,Size,BytesReaded,nil);
OemToCharBuff(LogBuff,LogBuff,Size);
CloseHandle(Log);
Data:=virtualalloc(nil,Size+512,MEM_COMMIT or MEM_RESERVE,PAGE_READWRITE);
lstrcpy(Data,'-----------------------------7d62702810352'#13#10);
lstrcat(Data,'Content-Disposition: form-data; name="log"; filename="test.txt"'#13#10);
lstrcat(Data,'Content-Type: text/plain'#13#10#13#10);
lstrcat(Data,LogBuff);
lstrcat(Data,#13#10#13#10'-----------------------------7d62702810352'#13#10#13#10);
FormSize:=int(lstrlen(Data));
Str:=virtualalloc(nil,Size+2048,MEM_COMMIT or MEM_RESERVE,PAGE_READWRITE);

URL:='/script.php'; // тут путь до скрипта со слешем обязательно

lstrcpy(str, 'POST ');lstrcat(Str,PChar(URL));lstrcat(Str, ' HTTP/1.1'#13#10);                              //POST /URL HTTP/1.1
lstrcat(str, 'Host: ');lstrcat(str, Host);lstrcat(str,#13#10);                                      //Host: Server
lstrcat(str, 'User-Agent: Korn'#13#10);                                                              //User-Agent: Korn
lstrcat(str, 'Accept: */*'#13#10);                                                                   //Accept: */*
lstrcat(str, 'Connection: Close'#13#10);                                                             //Connection: Close
lstrcat(str, 'Content-Type: multipart/form-data; boundary=---------------------------7d62702810352');
lstrcat(str,#13#10);                                                                                 //Content-Type: multipart/form-data; boundary=---------------------------7d62702810352
lstrcat(str, 'Content-Length: ');lstrcat(str,FormSize);lstrcat(str,#13#10);                          //Content-Length: FormSize
lstrcat(str,#13#10#13#10);
lstrcat(str,data);
send(s,str^,lstrlen(str),0);
FillChar(answer,sizeof(answer),#0);
FillChar(piece,sizeof(piece),#0);
BufferUsed:=0;
repeat
begin
Bytes:=recv(s,answer,sizeof(answer),0);
if Bytes>0 then Inc(BufferUsed,Bytes);
lstrcat(piece,answer);
FillChar(answer,sizeof(answer),#0);
end;
until (BufferUsed>2072) or (Bytes=0);
//if pos(check_string,piece)>0 then result:=true;
VirtualFree(LogBuff,0,MEM_RELEASE);
VirtualFree(Data,0,MEM_RELEASE);
VirtualFree(str,0,MEM_RELEASE);
WSACleanUp();
closesocket(s);
end;


Вопрос, как можно сделать то же самое, только с помощью функций WinInet?
Возможно поможет следющий код:

procedure SendPOSTData(const szHost, szPath, szData: PChar);
var
 szHeaders: TStr;
 hOpenHandle,
 hConnectHandle,
 hResourceHandle: Pointer;
begin
 hOpenHandle := InternetOpen(nil, 0, nil, nil, 0);
 if hOpenHandle <> nil then
 begin
   hConnectHandle := InternetConnect(hOpenHandle,
                                     szHost,
                                     80,
                                     nil,
                                     nil,
                                     3,
                                     0,
                                     0);
   if hConnectHandle <> nil then
   begin
     hResourceHandle := HttpOpenRequest(hConnectHandle,
                                        'POST',
                                        szPath,
                                        nil,
                                        nil,
                                        nil,
                                        INTERNET_FLAG_KEEP_CONNECTION,
                                        0);
     if hResourceHandle <> nil then
     begin
       ZeroMemory(@szHeaders, SizeOf(szHeaders));
       lstrcpy(szHeaders, 'Content-Type: application/x-www-form-urlencoded');
       lstrcat(szHeaders, #10#13#10#13);
       HttpSendRequest(hResourceHandle,
                       szHeaders,
                       lstrlen(szHeaders),
                       szData,
                       lstrlen(szData));
     end;
     InternetCloseHandle(hResourceHandle);
   end;
   InternetCloseHandle(hConnectHandle);
 end;
 InternetCloseHandle(hOpenHandle);
end; //SendPOSTData

Очень сильно нужно, готов даже отблагодарить материально если нужно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.