Как отделить двоичный файл / post-data / html от ответа HTTP? - PullRequest
2 голосов
/ 23 марта 2012

Я пишу простую функцию, которая разделяет двоичный файл / post-data / html из ответа HTTP. Заголовки HTTP завершаются \r\n\r\n, остальное - сообщение.

Я написал это:

 #define MAX_BUFFER_SIZE 256
    //... 
    int size = 0;
    int buf_size = MAX_BUFFER_SIZE;
    char * headers = malloc(MAX_BUFFER_SIZE);
    char * newbuf;

    while(httpresponse[size]) {
        if(httpresponse[size]     == '\r' &&
           httpresponse[size + 1] == '\n' &&
           httpresponse[size + 2] == '\r' &&
           httpresponse[size + 3] == '\n') {
            break;
        }

        headers[size] = httpresponse[size];     

        if(size >= buf_size) {
            buf_size += MAX_BUFFER_SIZE;
            newbuf = realloc(headers, buf_size);

           if(NULL ==  newbuf) exit(1);
           headers = newbuf;

         }

           size ++;
        }

        printf("%s\n", headers);

переменная httpresponse, имеет значение, подобное:

HTTP/1.1 200 OK
Date: Fri, 23 Mar 2012 15:28:17 GMT
Expires: Sat, 23 Mar 2013 15:28:17 GMT
Cache-Control: public, max-age=31536000
Last-Modified: Thu, 14 Apr 2011 15:46:35 GMT
Content-Type: image/jpeg
Content-Length: 12745
X-XSS-Protection: 1; mode=block
Connection: close

���������I1��} �g������'�B�f�p���ohd]sft�����J�������1����瘿ٱ����$3�G�8��4=�E�i����ܼG����H��nbi�"�1��b[Ǘl��++���OPt�W��>�����i�]t�QT�N/,Q�Qz������0�`    N7���M��f��S�Š�x9k��$*

//more binary... 

но в вышеприведенной программе на C выведите следующий текст:

HTTP/1.1 200 OK
Date: Fri, 23 Mar 2012 17:12:09 GMT
Expires: Sat, 23 Mar 2013 17:12:09 GMT
Last-Modified: Thu, 14 Apr 2011 15:46:35 GMT
Content-Type: image/jpeg
Content-Length: 12745
X-XSS-Protection: 1; mode=block
Cache-Control: public, max-age=31536000
Age: 3746
�2�/���ms���|ނ����LQr2K3�v��J.�,�z��^Oy����s(ct���X`iA����I����U�{

вместо:

    HTTP/1.1 200 OK
    Date: Fri, 23 Mar 2012 15:28:17 GMT
    Expires: Sat, 23 Mar 2013 15:28:17 GMT
    Cache-Control: public, max-age=31536000
    Last-Modified: Thu, 14 Apr 2011 15:46:35 GMT
    Content-Type: image/jpeg
    Content-Length: 12745
    X-XSS-Protection: 1; mode=block
    Connection: close

как это исправить? Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 18 августа 2014

Я использую следующий код:

const QByteArray& data = socket->readAll();
int index = data.indexOf("\r\n\r\n");
QString sHeader;
QString sBody;
if (index < 0)
    sHeader = QString::fromUtf8(data);
else
{
    sHeader = QString::fromUtf8(data.left(index));
    sBody = QString::fromUtf8(data.mid(index + 4));
}

QIssHttpRequestHeader requestHeader(sHeader); // QIssHttpRequestHeader is a copy of QHttpRequestHeader from Qt4

if (requestHeader.method() != "GET")
{
    send501Error(socket);
    return;
}

QUrl url(requestHeader.path());
...
0 голосов
/ 23 марта 2012

Вы уверены в выходах?Вы сказали, что httpresponse, заканчивается в этом случае X-XSS-Protection: 1; mode=block и Connection: close, но ваш выходной результат заканчивается следующим образом: X-XSS-Protection: 1; mode=block и Cache-Control: public, max-age=31536000 ?? !!?

, если вы уверены, что копируете выходные данныеда, похоже, конец твоего времени неверен.

0 голосов
/ 23 марта 2012

Я думаю, что ваш код в порядке, за исключением того, что malloc не инициализирует выделенную память.Это означает, что когда вы ВЫРЫВАЕТЕ из цикла while, у захваченной строки «headers» нет нулевого байта, завершающего ее.

Два способа исправить - эфир использует «calloc», который инициализирует память какдвоичные нули или вставьте одну строку кода перед вашим вызовом printf:

 headers[size] = '\0'

Cheers

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