Есть http прокси, на localhost:8080.
Хочу получить файл из инета. Делаю:
telnet localhost 8080
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Пишу:
CONNECT myserver.ru:443 HTTP/1.1
HOST myserver.ru:443
Получаю:
HTTP/1.1 200 Connection established
Via: 1.1 RELAY
Пишу:
GET http://myserver.ru/test/news.php HTTP/1.0
После этого получаю:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
Reason: You're speaking plain HTTP to an SSL-enabled server port.<br />
Instead use the HTTPS scheme to access this URL, please.<br />
<blockquote>Hint: <a href="https://myserver.ru/"><b>https://myserver.ru/</b>
</a></blockquote></p>
<hr />
<address>Apache/2.0.46 (Red Hat) Server at myserver.ru Port 443</address>
</body></html>
Connection closed by foreign host.
Как сформировать правильный запрос? Что именно надо писать
и как правильно работать с http proxy?
Пробовал так:
GET https://myserver.ru/test/news.php HTTP/1.0
То же самое.
Забыл сказать.
Пишу на Qt, хочу записать данные в QTextBrowser, но как работать
с http proxy, не нашёл. Решил сформировать запрос и посылать его
на мой прокси. Поэтому perl/etc ... не предлагать.
Ты наверное еще толком не проснулся - пойди кофейку бахни :-)))
> HOST myserver.ru:443
Ты идешь на SSL порт!
На что получаешь закономерный ответ:
> Your browser sent a request that this server could not understand.
> Reason: You're speaking plain HTTP to an SSL-enabled server port.
Для невладеющих албанским перевожу:
Сервер не понимает запрос, отправленный вашим броузером.
Причина: Вы посылаете HTTP запрос открытым текстом на SSL порт.
Асилил?
Рекомендации:
1. Проснуться и перестать тормозиить.
2. Выучить албанский.
3. Не изобретать велосипед а использовать какую-либо библиотеку.
Из своего опыта рекомендую libcurl (http://curl.haxx.se/libcurl/).
Она умеет HTTP,HTTPS,FTP,proxy, разные аутентикации и все такое прочее. Причем все это через простой и понятный API.
(BTW, а в самом Qt точно нет API для HTTP-клиента?)
$ telnet proxy_host proxy_port
Trying proxy_host...
Connected to proxy_host.
Escape character is '^]'.
HEAD http://ya.ru/ HTTP/1.0
HTTP/1.0 200 OK
Server: thttpd/2.25b 29dec2003
Content-Type: text/html; charset=windows-1251
Date: Tue, 08 Nov 2005 08:48:33 GMT
Last-Modified: Mon, 07 Nov 2005 15:13:13 GMT
Accept-Ranges: bytes
Connection: close
Content-Length: 2005
Connection closed by foreign host.
Либо по HTTP/1.1
$ telnet proxy_host proxy_port
Trying proxy_host...
Connected to proxy_host.
Escape character is '^]'.
HEAD http://ya.ru/ HTTP/1.1
Host: ya.ru
HTTP/1.1 200 OK
Server: thttpd/2.25b 29dec2003
Content-Type: text/html; charset=windows-1251
Date: Tue, 08 Nov 2005 08:49:12 GMT
Last-Modified: Mon, 07 Nov 2005 15:13:11 GMT
Accept-Ranges: bytes
Connection: close
Content-Length: 2005
Connection closed by foreign host.
1) Читай блин RFC!!! Там всё написано!
2) Не используй велосипед(как сказал предыдущий оратор)
Давно уже всё написано до тебя.
Парни, вы че - тоже не проснулись? :-)))
Вы хоть изначальный постинг асилили?
Человек хочет HTTPS. Причем он правильно понимает,
что для этого ему нужен именно CONNECT через прокси.
Чего он не понимает - так это того, что он должен теперь
сам сделать SSL connection и через него уже посылать свои
запросы. Бузусловно, можно вручную подрочить OpenSSL.
Но быстро кончить не получиться. :-)))
А можно взять готовую библиотеку (libcurl, libwww, ...)
и не иметь геморроя с HTTP протоколом, SSL и прочим
"закатом солнца вручную".
Всем спасибо, уже разобрался!
Теперь прокомментирую:)
2dlomin:
Спасибо за поддержку, хоть кто-то не начал сразу орать:)
2Onanim:
я кое-что не объяснил, поэтому мой вопрос наверное кажется глупым.
Я попробовал сначала через QHttp, но неверно использовал этот класс.
Поэтому стал разбираться, что же нужно для работы с прокси.
Я пробовал не указывать 443, у меня ничего
не получалось. Я поискал в инете, наткнулся на CONNECT,
присоединился к 443 и ... получил 200 ! :) Поэтому подумал, что буду
делать через HTTPS.
Но это я делал наспех.
2Dimez:
Ответ хороший, но всё оказалось значительно проще.
В Qt есть класс QHttp, он прекрасно работает,
Просто я не сразу разобрался, как его использовать с прокси.
QHttpRequestHeader header( "GET", "http://myserver.ru/test/news.php" );
header.setValue( "Host", "myserver.ru" );
http->setHost( "localhost", 8080 );
http->request( header );