C++ работа с прокси

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by fire64, 16 May 2010.

  1. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    Здравствуйте.
    Я пытаюсь отправлять GET запросы через HTTP прокси, однако в результате вместо содержимого нужного сайта получаю ошибку HTTP 301 Moved

    PHP:
    char *GetQueryFromProxychar *urlchar *proxyhostchar *proxyportchar *Cookie )
    {
        
    char fulurl[512] = "";

        
    sprintffulurlurl);

        if (
    memcmp(url,"HTTP://",7)!=&& memcmp(url,"http://",7)!=0)
        {
            return 
    NULL;
        }

        
    url+=7;

        
    // Ïîëó÷èì èìÿ õîñòà, íîìåð ïîðòà è ïóòü ----------------------------
        
    char *http_host=strdup(url); // Èìÿ õîñòà (HTTP_HOST)
        
    int port_num;             // Íîìåð ïîðòà ïî óìîë÷àíèþ (HTTP_PORT)
        
    char *http_path=NULL;        // Ïóòü (REQUEST_URI)

        
    char *pch=strchr(http_host,':');
        if (!
    pch)
        {
            
    pch=strchr(http_host,'/');
            
            if (
    pch)
            {
                *
    pch=0;
                
    http_path=strdup(pch+1);
            }
            else
            {
                
    http_path=strdup("");
            }
        }
        else
        {
            *
    pch=0;pch++;
            
    char *pch1 strchr(pch,'/');

            if (
    pch1)
            {
                *
    pch1=0;
                
    http_path=strdup(pch1+1);
            }
            
            else 
    http_path=strdup("");
        }
        
        
    port_num atoi(proxyport);

        if (
    port_num==0)
        {
            
    port_num 80;
        }
        
        
    WSADATA wsaData;

        
    WSAStartup(MAKEWORD(2,2), &wsaData);

        
    SOCKET  name_sock;

        
    name_sock=socket AF_INETSOCK_STREAMIPPROTO_TCP ); 

        
    sockaddr_in  dest_addr;
        
    dest_addr.sin_family=AF_INET;
        
    dest_addr.sin_port=htons port_num );
        
    dest_addr.sin_addr.s_addr resolve(proxyhost);

        
    int server_addr_size sizeof(dest_addr);

        if( 
    connect(name_sock, (sockaddr*)&dest_addrsizeof(dest_addr)) == -)
        {
            
    closesocket(name_sock );

            
    WSACleanup();

            return 
    NULL;
        }
        else
        {
            
    char query[2048];

            
    strcpy(query,"GET ");
            
    strcat(query,fulurl);
            
    strcat(query," HTTP/1.1\r\nHost: ");
            
    strcat(query,http_host);
            
    strcat(query,"\r\nUser-agent: Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
            
            
    strcat(query,"\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
            
    strcat(query,"\r\nAccept-Language: ru,en-us;q=0.7,en;q=0.3");
            
    strcat(query,"\r\nAccept-Encoding: gzip,deflate");
            
    strcat(query,"\r\nAccept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7");
            
    strcat(query,"\r\nKeep-Alive: 115");
            
    strcat(query,"\r\nProxy-Connection: keep-alive");
          
            if( 
    Cookie )
            {
                
    strcat(query,"\r\nCookie: ");
                
    strcat(query,Cookie);
            }
            
            
    strcat(query,"\r\n\r\n");


            
    // Send the magic http request
            
    if (send(name_sockquerystrlen(query), 0) == SOCKET_ERROR)
            {
                
    closesocket(name_sock );

                
    WSACleanup();

                return 
    NULL;
            }
        }

        
    int nNumRead;

        
    int otvetsize;

        
    char otvet[40960];

        
    otvetsize 40960;

        
    nNumRead recv(name_sockotvetotvetsize0);

        
    closesocket(name_sock );

        
    WSACleanup();

        return 
    otvet;
    }
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Code:
      if (memcmp(url,"HTTP://",7)!=0 && memcmp(url,"http://",7)!=0)
        {
            return NULL;
        }
    
    Это просто пздц. А если я напишу Http:// то облом будет. Юзай memicmp

    А вообще HTTP 301 Moved
    значит страница перенесена и в Location указан адрес куда перейти тебе нужно
     
    1 person likes this.
  3. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    В том то и дело, что через браузер работает, а через мой код всегда ошибка 301 с ссылкой на введенный сайт
     
  4. POS_troi

    POS_troi Elder - Старейшина

    Joined:
    1 Dec 2006
    Messages:
    1,569
    Likes Received:
    466
    Reputations:
    108
    в заголовках в поле Location что ? (по стопам slesh)
     
    1 person likes this.
  5. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    Вот попытка запроса сайта http://google.ru

    Code:
    HTTP/1.1 301 Moved Permanently
    Accept-Encoding: identity
    Connection: close
    Location: http://www.google.ru/
    Content-Type: text/html; charset=UTF-8
    Date: Sun, 16 May 2010 19:46:19 GMT
    Expires: Tue, 15 Jun 2010 19:46:19 GMT
    Cache-Control: public, max-age=2592000
    Server: gws
    Content-Length: 218
    X-XSS-Protection: 1; mode=block
    
    <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
    <TITLE>301 Moved</TITLE></HEAD><BODY>
    <H1>301 Moved</H1>
    The document has moved
    <A HREF="http://www.google.ru/">here</A>.
    </BODY></HTML>
    
     
  6. d_x

    d_x Banned

    Joined:
    25 Mar 2008
    Messages:
    558
    Likes Received:
    650
    Reputations:
    210
    Потому что обращаться надо к http://www.google.ru/
     
    1 person likes this.
  7. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    Ок, точно
    спасибо всем за помощь