2016-09-19 3 views
1

я сделать запрос GET с C в следующем коде:GET HTTP запрос в C (Message Body)

char buffer[1024] = 
     "GET/HTTP/1.1\r\n" 
     "Host: example.com\r\n" 
     "Accept-Encoding: gzip, deflate\r\n" 
     "Accept-Language: en-US,en;q=0.5\r\n" 
     "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0\r\n" 
     "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" 
     "Connection: keep-alive\r\n" 
     "Cache-Control: max-age=0\r\n\r\n"; 

    size_t buffer_len = sizeof(buffer) - 1; 

    /* Send message to the server */ 
    n = write(sockfd, buffer, buffer_len); 

    /* Now read server response */ 
    bzero(buffer, strlen(buffer)); 
    n = read(sockfd, buffer, buffer_len); 

    /* Display result */ 
    printf("%s\n",buffer); 
    return 0; 

Правильно ответить:

HTTP/1.1 200 OK 
Date: Mon, 19 Sep 2016 17:20:48 GMT 
Server: Apache 
Content-Encoding: gzip 
Vary: Accept-Encoding 
Content-Length: 6695 
Keep-Alive: timeout=2, max=100 
Connection: Keep-Alive 
Content-Type: text/html; charset=UTF-8 

� 

для последней строки, которая должна быть сообщений, за исключением Body, вместо html-контента. Он отображается только как символ. Кто-нибудь знает, где может быть проблема?

+1

Насколько велик «буфер»? Похоже, вам нужно прочитать по крайней мере 7000 символов с сервера. Вам может потребоваться несколько раз вызвать 'read'. –

+0

Я также рекомендую заглянуть в Wireshark, чтобы вы могли точно видеть, что отправляется ., как с помощью вашего кода, так и с помощью браузера или netcat (известного рабочего клиента), чтобы увидеть, есть ли какие-либо расхождения. – yano

+2

Замечание 'Content-Encoding: gzip' в ответе. –

ответ

4

Вы сказали серверу, что готовы принять сжатый ответ (см. Accept-Encoding: gzip, deflate), поэтому сервер отправил вам gzip-сжатый ответ (см. Content-Encoding: gzip). Ваш код фактически не поддерживает декомпрессию (для этого вы можете использовать zlib library), поэтому вам нужно удалить Accept-Encoding из вашего заголовка запроса. Затем вы получите ответ с телом сообщения, который не сжат.

+0

Теперь отображается обычный текст, и действительно, это не вся страница –

+1

@IsabelCariod: ваш код не пытается обрабатывать заголовки ответов ** вообще **. Вам нужно обработать заголовки, они расскажут вам, как кодируется ответ, и, следовательно, как его читать. Обратите внимание на заголовки 'Content-Length' и' Transfer-Encoding', чтобы знать * сколько * байтов ожидать, и * как * читать байты. [Подробнее читайте RFC 2616 Раздел 4.4 Длина сообщения] (https://tools.ietf.org/html/rfc2616#section-4.4) и посмотрите этот [псевдокод] (http://stackoverflow.com/a/7234357/65863) для логики чтения, которую нужно реализовать в коде. –