Реализация HTTP-прокси: ошибка кодировки содержимого - PullRequest
0 голосов
/ 04 мая 2018

Я использую прокси. Я мог получить ответ от сервера, но не смог отправить ответ клиенту.

Чтобы быть более подробным, я мог только отредактировать содержимое заголовка ответа, но не смог отправить тело сообщения. И веб-страница показывает «ошибка кодирования содержимого» * ​​1003 *

    //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));
    }

Here is what I got, header is sent to client successfully, but following message body is not

Я тоже пробовал:

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.

Однако, независимо от того, какую функцию я использую, тело сообщения не отправляется успешно. как показано на странный символ выше Есть намеки?

Большое спасибо заранее

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

В кодировке содержимого указано gzip, поэтому данные, поступающие с сервера, будут иметь двоичные данные в своем теле ответа http, который также может содержать нулевой символ, так что вы можете в итоге отправить частичные данные, как вы использовали strlen() в send(), что Ваш клиент не сможет расшифровать

0 голосов
/ 04 мая 2018

Функция recv возвращает количество прочитанных байтов, которое вы могли бы использовать при вызове функции send.

Вы использовали strlen, который основан на обнаружении нулевого символа, чтобы найти конец буфера, что в этом случае недопустимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...