Как сохранить http ответ и отправить в браузер? - PullRequest
0 голосов
/ 08 июня 2019

Я делаю упражнение о прокси-сервере.У меня есть некоторые проблемы при кэшировании в Proxy Server.Следующий исходный код используется, когда сервер отправляет ответ прокси-серверу, и прокси пересылает его клиенту.Это нормально.

//that code is ok
fstream File;
while (P->isClientClose == FALSE && P->isServerClose == FALSE){
    memset(Data, 0, 1024);
    int length = recv(*(P->SERVER), Data, sizeof(Data), 0);
    if (length <= 0)
        break;
    length = send(*(P->CLIENT), Data, length, 0);
    if (length <= 0)
        break;
}

Но когда я пытаюсь записать HTTP-ответ в файл, а затем прочитать все символы из файла для отправки клиенту, у меня возникает проблема.браузер сказал: ERR_CONTENT_DECODING_FAILED

Я проверяю, как работает прокси-кеш, но я не могу понять, где ошибка.Даже когда я создаю строку Temp (Data) и использую send (* (P-> CLIENT), Temp.c_str (), length, 0), клиент все равно говорит об этой ошибке.Пожалуйста, помогите мне.: D

//that code is error
fstream File;
while (P->isClientClose == FALSE && P->isServerClose == FALSE){
    memset(Data, 0, 1024);
    int length = recv(*(P->SERVER), Data, sizeof(Data), 0);
    if (length <= 0)
        break;

    File.open("test.dat", ios::out|ios::binary);
    File << Data;
    File.close();
    File.open("test.dat", ios::in|ios::ate|ios::binary);
    ifstream::pos_type pos = File.tellg();
    int size = pos;
    cout << "size: " << size << endl;
    char *pChars = new char[size+1]{};
    File.seekg(0, ios::beg);
    File.read(pChars, size);
    File.close();   
    length = send(*(P->CLIENT), pChars, length, 0);
    delete[]pChars;
    if (length <= 0)
        break;
}

1 Ответ

0 голосов
/ 08 июня 2019

Выделяются некоторые вещи.

Обновление: похоже, у вас отсортированы сообщения, поэтому я удалил этот дриблинг.

Но я думаю, что ваша проблема в строке: File <<Data; </p>

VTT верен, указав, что File << Data не записывает полное содержимое нашего указателя Data в файл.Оператор << не знает длины данных, которые вы хотите записать.Кроме того, не похоже, что у оператора << есть перегрузка char *.См .: <a href="http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/" rel="nofollow noreferrer">http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/

Я предполагаю, что Data - это символ *.

Вместо File << Data, попробуйте: </p>

 File.write( Data, length);    

А затем прочитайте его и напишитеэто клиенту ....

...