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;
}
Я пытаюсь отправлять 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;
}