【问题标题】:HTTP proxy implementation: content encoding errorHTTP 代理实现:内容编码错误
【发布时间】:2018-05-04 15:35:22
【问题描述】:

我正在实施代理。我可以收到来自服务器的响应,但未能将响应发送给客户端。

更详细地说,我只能渲染响应头内容,但无法发送消息正文。并且网页显示'内容编码错误'

    //I could sending request to server successfully.
    send(connfd_to_server, request, strlen(request), 0);

    //receive response from server
    char res_buf[1024];
    while(1){
        bzero(res_buf, 1024);
        if(recv(connfd_to_server, res_buf, sizeof(res_buf),0) <=0){
            break; //if recv failed, then message body is finished.
        }  //receive response using recv
        send(connfd_to_client, res_buf, strlen(res_buf));
    }

我也试过了:

char* response = (char*)malloc(strlen(res_buf));
char* res_line;
res_line = strtok(res_buf, "\r\n");
for(int i = 0; i<=11; i++){
     strcat(response, res_line);
     strcat(response, "\r\n");
     res_line = strtok(NULL, "\r\n");
}    //copy header content using strcat

while(res_line!= NULL){
    memcpy(response, res_line, sizeof(res_line));
    res_line = strtok(NULL, "\r\n");
}   //copy message body as bytes using memcpy

then send response to client using send function.

但是,无论我使用哪个功能,消息正文都没有成功发送。 就像上面一个奇怪的符号所示 有什么提示吗?

在此先感谢

【问题讨论】:

    标签: c proxy


    【解决方案1】:

    函数recv返回调用函数send时可以使用的读取字节数。

    您使用了 strlen,它基于检测空字符来查找缓冲区的结尾,在这种情况下是无效的。

    【讨论】:

      【解决方案2】:

      内容编码使用 gzip,因此来自服务器的数据将在其 http 响应正文中包含二进制数据,其中也可能包含空字符,因此您最终可能会发送部分数据,因为您在 send() 中使用了 strlen(),即您的客户端将无法解码

      【讨论】:

      • 对!我知道了!但是,memcpy() 怎么样?我还尝试使用 memcpy() 复制邮件正文?我认为 memcpy() 可以逐字节复制响应字节。为什么它不起作用我们也一样?你能帮帮我吗?
      • 在您的 send() 调用中,只需使用 recv() 返回的值,而不是对收到的数据执行 strlen()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多