Браузер не заканчивает что то подгружать, после получения ответа от сервера

141
14 января 2022, 17:10

Я пишу свой небольшой 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);

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

READ ALSO
Создание модального окна с прогресс баром

Создание модального окна с прогресс баром

По нажатию на кнопку из пункта меню, происходит сначала вызов прогресс бара по истечению 5 секунд переход на диалоговое окноПопытался сделать...

136
Вылезла ошибка в codelite на linux

Вылезла ошибка в codelite на linux

выходит при компиляции проекта в codelite(ubuntu 1804)

65
C2440: Невозможно преобразовать const char* в PVOID

C2440: Невозможно преобразовать const char* в PVOID

Пишу программу-шутника, который будет менять изображение рабочего стола: В одной из строчек кода возникла ошибка:

169
Как передать двумерный массив в функцию?

Как передать двумерный массив в функцию?

Два массива разного размера передаём в функцию для дальнейшей обработки

72