通过代理发出请求时出现HTTP错误

HTTP errors while making a request through a proxy

本文关键字:HTTP 错误 请求 代理      更新时间:2023-10-16

我想知道如何使用Socket通过代理发出HTTP请求。

我在互联网上查看文档,很多人说要做到这一点,我必须连接到代理服务器并发送一个带有以下标题的数据包:

send(Socket, "CONNECT http://icanhazip.com:80 HTTP/1.0rnrn", strlen("CONNECT http://icanhazip.com:80 HTTP/1.0rnrn"), 0);

该网站返回当前的公共IP,但不幸的是,我尝试的每个代理服务器都返回了错误,而不是网页的HTML源代码。

这是我的实际代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
    try {
        int Socket = socket(AF_INET, SOCK_STREAM, 0);
        sockaddr_in SockAddr;
        memset(&SockAddr, 0, sizeof(SockAddr));
        SockAddr.sin_port = htons(80);
        SockAddr.sin_family = AF_INET;
        SockAddr.sin_addr.s_addr = inet_addr("198.169.246.30");
        int iResult = connect(Socket, (struct sockaddr *)& SockAddr, sizeof(SockAddr));
        if (iResult != 0) {
            std::cout << "I can't connect :(.";
            getchar();
            return 1;
        }
        std::cout << "Connected.n";
send(Socket, "CONNECT http://icanhazip.com:80 HTTP/1.1rnrn", strlen("CONNECT http://icanhazip.com:80 HTTP/1.1rnrn"), 0);
 char buffer[10000];
        int nDataLength;
        while ((nDataLength = recv(Socket, buffer, 10000, 0)) > 0) {
            int i = 0;
            while (buffer[i] >= 32 || buffer[i] == 'n' || buffer[i] == 'r') {
                std::cout << buffer[i];
                i += 1;
            }
        }
        iResult = close(Socket);
    }
    catch (...) {
    }
    return 0;
}

我能做些什么来修复它?或者,我应该研究其他什么解决方案?

中国古代谚语说,"在编写代码之前,最好先阅读规范";

https://www.rfc-editor.org/rfc/rfc7230

通过文档中的以下链接:

发送CONNECT请求的客户端必须发送请求目标([RFC7230]第5.3节);即请求目标仅由隧道的主机名和端口号组成目的地,用冒号分隔。例如,

CONNECT server.example.com:80 HTTP/1.1
 Host: server.example.com:80

来源:https://www.rfc-editor.org/rfc/rfc7231#section-4.3.6