Поиск новых строк в HTTP-ответах - PullRequest
1 голос
/ 18 ноября 2011

В настоящее время у меня есть программа, которая в основном читает html с веб-страницы.После отправки веб-серверу http-запроса я получаю ответ, в котором я использую fdopen для чтения сокета:

FILE *webpage = fdopen(socket, "r");

, затем у меня есть цикл, который использует fgets для получения каждой строки и затем распечатывает их вfile:

while(!feof(webpage)){
    fgets(newline, 1000, webpage);
    fprintf ...
}

Эта часть программы работает нормально, и я в итоге получаю какой-то тестовый файл, например:

HTTP/1.1 200 OK^M
Date: Fri, 18 Nov 2011 04:42:40 GMT^M
Server: Apache/2.2.14^M
Accept-Ranges: bytes^M
Cache-Control: max-age=0^M
Expires: Fri, 18 Nov 2011 04:42:40 GMT^M
Vary: Accept-Encoding^M
Content-Length: 345235^M
Connection: close^M
Content-Type: text/html^M
X-Pad: avoid browser bug^M
^M
<html lang="en">
<head>
...

Я хочу найти эту новую строку прямо под xpad,и вставьте что-нибудь правильно, когда найдена новая строка (в основном, сделайте что-нибудь сразу после того, как напечатаны заголовки. Однако я не уверен, как найти строку или для чего нужны ^ Ms.

В настоящее время я 'я пробую что-то вроде

if(newline == "\r\n"){
   ... 
}

или просто "\ n", и это не работает. Я думаю, что это как-то связано с ^ M, но я не уверен.

Спасибо!

Ответы [ 3 ]

1 голос
/ 18 ноября 2011

Для заголовков HTTP использует пары возврата каретки + перевода строки, чтобы отметить окончания строки - так что «^ M», который вы видите, является символом возврата каретки.Окончания строк в теле после заголовков могут быть помечены по-разному, если это разрешено конкретным приложением.

Конец заголовков отмечен пустой строкой, поэтому первым символом в этой строке является возврат каретки(даже другие пробелы не могут появиться перед ним).Таким образом, когда вы впервые обнаружите '\ r' в качестве первого символа в строке, вы обнаружите конец заголовков;все остальные линии являются частью тела.

if(newline == "\r\n"){ не работает, потому что вы не можете сравнивать строки таким образом - вы проверяете адрес, на который указывает newline, на равенство с адресом строкового литерала "\r\n", чтобудет ложным, даже если символы в newline совпадают.strcmp() или strncmp() будет работать, но, поскольку это всего два символа, вы можете сравнить их по отдельности (может быть, даже быстрее).Также маловероятно, что вы получите '\r' вне конца строки, так что вы, вероятно, можете просто проверить это.

Если buf достаточно велико, чтобы вместить любую из строк заголовка,следующее примерно описывает, что делать (хотя бы один подход):

char buf[BUFSZ];
// ...
while( fgets( buf, BUFSZ, sock ) ) {
  if (buf[0] == '\r') {  // or (buf[0] == '\r' && buf[1] == '\n') to be strict
    // DO STUFF for end of header section
    break;
  } else {
    // DO STUFF for a header line
  }
}
// if needed, get rest of document
while( fgets( buf, BUFSZ, sock ) ) {
  // DO STUFF for a body line
} 
0 голосов
/ 18 ноября 2011

Эти ^M являются символами новой строки Windows.Вернее ASCII CR.Попробуйте искать только \r вместо \r\n.

0 голосов
/ 18 ноября 2011

^ M (Ctrl + M) - возвращение ascii-каррига. Я думаю, вы можете искать только \ r, а не \ r \ n

Я думаю, что в идеале вы хотите проверить регулярное выражение и проверить наличие символа новой строки в начале строки, т. Е. ^ \ N, вы можете просто проверить .length и посмотреть, содержит ли она новую строку, если ее 0. Вы просто хотите убедиться, что вы не уловили ложных поз.

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