LINUX.ORG.RU

Как получить заголовки https страниц с помощью QNetworkAccessManager

 , , ,


1

2

Программа работает так: Когда в браузере заходим на какой либо сайт, используется прокси и подключается к моему серверу (qtcpserver). Далее сервер получает некие данные сайта на который пытаемся зайти. После получения информации необходимо чтобы мой сервер вернул какую-то инфу обратно браузеру, чтобы браузер отобразил загруженную страницу сайта. Т.е.

Загрузка какой-либо страницы в браузере -> отправка заголовка ответа на мой сервер -> отправка запроса сервером на сайт -> получение ответа от сайта -> отправка данных полученных от сайта обратно в браузер. И вот здесь существует две проблемы. Первая: При получении доступа к сайту http мне удается получить и заголовок моего запроса (GET ...) и заголовок ответа сайта. Но при попытке подключиться к https мой запрос на сайт выглядит примерно так:

CONNECT e.mail.ru:443 HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:63.0) Gecko/20100101 Firefox/63.0
Proxy-Connection: keep-alive
Connection: keep-alive
Host: e.mail.ru:443
Так вот каким образом я могу добиться, чтобы мне выдавало GET запрос для https сайтов, а не CONNECT? Запрос получаю таким образом:
QTcpSocket* clientSocket = (QTcpSocket*)sender();
    socket_ = (QTcpSocket*)sender();
    QString str;
    str = clientSocket->readAll();
Ответ таким образом:
//Функция отправки запроса сайту
void QTCPServerClass::funcSiteRequest(QString str)
{
    QNetworkRequest request(str);
    QNetworkReply* reply=  manager->get(request);
connect(reply,SIGNAL(finished()),this,SLOT(replyFinished()));
}

//Слот получения заголовков ответа
void QTCPServerClass::replyFinished()
{
        QList<QByteArray> list; QString str;
        QNetworkReply *reply= qobject_cast<QNetworkReply *>(sender());
        if (reply->error() == QNetworkReply::NoError){
            list.append(reply->rawHeaderList());
            foreach(QByteArray head, list) {
                str = str + head +":" + reply->rawHeader(head) + "\r\n";
            }
           
        } else{
           // qDebug()<<reply->errorString();
        }
    } 
}
Теперь вторая проблема. Необходимо полученный код страницы вернуть браузеру. Пытаюсь сделать таким образом:
QByteArray arrBlock;
     arrBlock.append(str);//полученное содержимое страницы через manager.get()
     socket_->write(arrBlock);
     socket_->disconnect();
Если я подключаюсь к сайту по типу http://www.example.com/, то проблемы нет, все без проблем возвращает браузеру. Но если я попытаюсь подключится к doc.crossplatform.ru/qt, то получу бесконечную загрузку до тех пор, пока не закрою свою программу.После закрытия программы сайт кое-как загрузится превратив русские символы в непонятный набор, а английские загрузит как нужно. Что нужно исправить, чтобы сайт загружало и без закрытия программы? А так же буду благодарен, если подскажите как решить проблему с русскими символами.

Ответ на: комментарий от annulen

Но мне необходимо реализовать это в своей программе через сокеты. Если бы мне подходили другие способы, то я мог бы просто зайти на сайт, который по адресу получает http заголовки. Но меня это, к сожалению, не устраивает))

hellomyfriend
() автор топика
23 января 2019 г.
Ответ на: mitmproxy от boganet9993

Добавить сертификат своей прокси в браузер как доверенный

annulen ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.