PDA

Просмотр полной версии : C++ работа с прокси


fire64
16.05.2010, 23:52
Здравствуйте.
Я пытаюсь отправлять GET запросы через HTTP прокси, однако в результате вместо содержимого нужного сайта получаю ошибку HTTP 301 Moved


char *GetQueryFromProxy( char *url, char *proxyhost, char *proxyport, char *Cookie )
{
char fulurl[512] = "";

sprintf( fulurl, url);

if (memcmp(url,"HTTP://",7)!=0 && 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_INET, SOCK_STREAM, IPPROTO_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_addr, sizeof(dest_addr)) == -1 )
{
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_sock, query, strlen(query), 0) == SOCKET_ERROR)
{
closesocket(name_sock );

WSACleanup();

return NULL;
}
}

int nNumRead;

int otvetsize;

char otvet[40960];

otvetsize = 40960;

nNumRead = recv(name_sock, otvet, otvetsize, 0);

closesocket(name_sock );

WSACleanup();

return otvet;
}

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


Это просто пздц. А если я напишу Http:// то облом будет. Юзай memicmp

А вообще HTTP 301 Moved
значит страница перенесена и в Location указан адрес куда перейти тебе нужно

fire64
17.05.2010, 00:00
В том то и дело, что через браузер работает, а через мой код всегда ошибка 301 с ссылкой на введенный сайт

POS_troi
17.05.2010, 00:05
в заголовках в поле Location что ? (по стопам slesh)

fire64
17.05.2010, 00:09
Вот попытка запроса сайта http://google.ru


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>

d_x
17.05.2010, 00:11
Потому что обращаться надо к http://www.google.ru/

fire64
17.05.2010, 00:28
Ок, точно
спасибо всем за помощь