0

Я пишу свой небольшой http-сервер в учебных целях.У меня есть две реализации ответа на статический запрос, идентичные по смыслу, просто в одной из них дейсвия разложены по функциям. Но в реализации которую я хочу заменить, после вызова функции send браузеру приходит ответ и колесико подгрузки перестает крутиться, а в новой - приходит ответ, но продолжает что то подгружатьсь. Почему так происходит? Еще нужно добавить, что во втором(нормально работающем) случае приходит запрос на favicon.ico, а в первом нет, отправляемые заголовки идентичны.

Код, при работе которого браузер продолжает подгружать:

     std::string buffer; // создаем буфер в который будем формировать сообщение, отправляемое браузеру
     std::ifstream file(getenv("path") + parser->get_file()); // открываем читаемый файл, скливая переменную окружения "путь" и имя файла
     if (file) // если файл открылся, продолжаем
      {
         while(!file.eof())// читаем построчно в буфер пока не дойдем до конца
         {
             std::string temp;
             std::getline(file, temp);
             buffer = buffer + temp;
         }
         heading head(buffer.length(), parser->get_file()); // этот класс формирует заголовок
         buffer = head.get_head() + buffer; // приклеиваем полученный заголовок к буферу
         file.close(); 
         send(newclient->get_client(), buffer.c_str(), buffer.length(), 0); // отправляем полученный буфер браузеру
       }
       else
       {
            send(newclient->get_client(), heading::error404().c_str(), heading::error404().length(), 0);
       }

работающий старый код:

std::string MSGbuffer, head;
head = "HTTP/1.1 200 OK\r\n";
std::string head1 = "Content-Type: text/html\r\n";
std::ifstream fin;
fin.open("/home/anton/test.html");
while(!fin.eof())
{
    std::string temp;
    std::getline(fin, temp);
    MSGbuffer = MSGbuffer + temp;
}
std::string head2 ="Content-Length: " + std::to_string(MSGbuffer.length()) + "\n\n";
MSGbuffer = head + head1 + head2 + MSGbuffer;
std::cout << head;
std::cout << head1;
std::cout << head2;
fin.close();
send(client_d, MSGbuffer.c_str(), MSGbuffer.length(), 0);

Отличия только в том, что в новом варианте,заголовок формирует отдельный класс и пути указываются не в ручну.

Denver Toha
  • 2,595
  • 2
    Дело не в этом, но все равно посмотрите сюда - https://ru.stackoverflow.com/questions/833980/%d0%9f%d1%80%d0%b0%d0%b2%d0%b8%d0%bb%d1%8c%d0%bd%d0%be%d0%b5-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%be%d0%b2%d0%b5%d1%80%d0%ba%d0%b8-%d0%ba%d0%be%d0%bd%d1%86%d0%b0-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0 – Harry Dec 23 '19 at 13:48
  • @Harry, ну косяк есть, но браузер-то не в курсе, что там два раза прочиталось - так что должно и при нём нормально работать. – Qwertiy Dec 23 '19 at 16:57
  • @Qwertiy Я же написал - дело не в этом. Просто чтоб человек исправил, а не искал потом еще одну ошибку... – Harry Dec 23 '19 at 17:12
  • @Harry, тьфу, опять я невнимательно читаю... – Qwertiy Dec 23 '19 at 17:12
  • Спасибо, исправил проблему нечитаемости картинок))) но как быть с подгрузкой браузера? – Denver Toha Dec 23 '19 at 17:57

0 Answers0