Здравствуйте. Я пытаюсь отправлять GET запросы через HTTP прокси, однако в результате вместо содержимого нужного сайта получаю ошибку HTTP 301 Moved PHP: 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; }
Code: if (memcmp(url,"HTTP://",7)!=0 && memcmp(url,"http://",7)!=0) { return NULL; } Это просто пздц. А если я напишу Http:// то облом будет. Юзай memicmp А вообще HTTP 301 Moved значит страница перенесена и в Location указан адрес куда перейти тебе нужно
В том то и дело, что через браузер работает, а через мой код всегда ошибка 301 с ссылкой на введенный сайт
Вот попытка запроса сайта 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>