ايران ويج

نسخه‌ی کامل: سوال در مورد Redirection Handling با WinInet
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
با سلام خدمت دوستان و همکاران عزیز

من یه فانکشن طراحی کردم که متد POST رو با WinInet پیاده سازی میکنه منتها ایراد کار اینه که Url ی که به فانکشن میدم اگه ریدایرکت بشه دیگه نمیتونه Response جدید رو بگیره و به مسیر جدید هدایت بشه کد زیر درست کار میکنه فقط مشکل کارش همینه عدم پشتیبانی از Redirection Handling هستش که از دوستان میخوام کمک کنن این فانکشن رو تکمیلش کنم

ممنون از همگی

کد:
type
  IResult = packed record
  Status : string;
  Result : string;
  Url:     string;
  Cookie:  string;
  Scanned: boolean;
  Size   : Dword;
  UseBreakFor:Boolean;
  BreakFor:Boolean;
  end;

کد:
function PostWithWinet(sURL,sPostData,UserAgent,Header,Cook  ie,ProxyServer:string;ProxyPort:integer):IResult;
const
  RequestMethod = 'POST';
  HTTP_VERSION  = 'HTTP/1.1';
var
  dwSize:DWORD;
  dwFileSize: Int64;
  dwBytesRead,dwReserved,size:DWORD;
  hInte,hConnection,hRequest:HInternet;
  ContentSize:array[1..1024] of Char;
  infoBuffer: array[0..20] of Char;
  lpBuffer:string;
  buf: array[0..1024 + 1] of Char;
  HostPort:Integer;
  HostName,FileName,sHeader,Reply:String;
  okay:LongBool;
  dwIndex,dwCodeLen:Dword;
  S:TStringList;




  procedure ParseURL(URL: string;var HostName,FileName:string;var HostPort:Integer);
  var
    i,p,k: DWORD;
    function StrToIntDef(const S: string; Default: Integer): Integer;
    var
      E: Integer;
    begin
      Val(S, Result, E);
      if E <> 0 then Result := Default;
    end;
  begin
    if lstrcmpi('http://',PChar(Copy(URL,1,7))) = 0 then System.Delete(URL, 1, 7);
    HostName := URL;
    FileName := '/';
    HostPort := INTERNET_DEFAULT_HTTP_PORT;
    i := Pos('/', URL);
    if i <> 0 then
    begin
      HostName := Copy(URL, 1, i-1);
      FileName := Copy(URL, i, Length(URL) - i + 1);
    end;
    p:=pos(':',HostName);
    if p <> 0 then
    begin
      k:=Length(HostName)-p;
      HostPort:=StrToIntDef(Copy(HostName,p+1,k),INTERNE  T_DEFAULT_HTTP_PORT);
      Delete(HostName,p,k+1);
    end;
  end;


begin
  dwFileSize :=0;
  if Cookie <> '' then UserAgent:=UserAgent+#13#10+'Cookie: '+Cookie;
  if Header <> '' then UserAgent:=UserAgent+#13#10+Header;
  Result.Scanned:=False;
  ParseURL(sURL,HostName,FileName,HostPort);
  if (ProxyServer <> '' )and(ProxyPort>0) then
  hInte := InternetOpen(Pchar(UserAgent), INTERNET_OPEN_TYPE_PROXY, Pchar(ProxyServer+':'+Inttostr(ProxyPort)), nil, 0) else
  hInte := InternetOpen(Pchar(UserAgent), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if hInte<>nil then
  begin
    hConnection := InternetConnect(hInte,PChar(HostName),HostPort,nil  ,nil,INTERNET_SERVICE_HTTP,0,0);
    if hConnection<>nil then
    begin
      hRequest := HttpOpenRequest(hConnection,PChar(RequestMethod),P  Char(FileName),HTTP_VERSION,'',nil,INTERNET_FLAG_N  O_CACHE_WRITE or INTERNET_FLAG_RELOAD,0);
      if hRequest<>nil then
      begin
        sHeader := 'Content-Type: application/x-www-form-urlencoded' + #13#10;
        sHeader := sHeader+'Cookie: '+Cookie+#13#10;




        HttpAddRequestHeaders(hRequest,PChar(sHeader),Leng  th(sHeader),HTTP_ADDREQ_FLAG_ADD or HTTP_ADDREQ_FLAG_REPLACE);
        if HttpSendRequest(hRequest,nil,0,PChar(sPostData),Le  ngth(sPostData)) then
        begin
          dwReserved:=0;
          dwSize:=SizeOf(ContentSize);
          if HttpQueryInfo(hRequest,HTTP_QUERY_CONTENT_LENGTH,@  ContentSize,dwSize,dwReserved) then
          begin
          hRequest := InternetOpenUrl(hRequest, PChar(sUrl), nil, 0, INTERNET_FLAG_RELOAD, 0);




          repeat
          begin
            dwBytesRead := 128;
           if not InternetReadFile(hRequest, @lpBuffer, 1024, dwBytesRead) then Break;
            lpBuffer[dwBytesRead] := #0;
            result.Result := result.Result + lpBuffer;
          end;
          until dwBytesRead =0;


          InternetGetCookie(Pchar(sUrl), nil, buf, size);
          Result.Url:=sUrl;
          Result.Cookie:=Buf;
          Result.Scanned:=True;
          InternetSetCookie(Pchar(sUrl),'',Buf);
          Result.Status:=GetStatus(hRequest).Status;
          end;
        end;
      end;


      InternetCloseHandle(hRequest);
    end;
    InternetCloseHandle(hConnection);
  end;
  InternetCloseHandle(hInte);


end;
مشکل حل شد با سپاس.