LINUX.ORG.RU

Получить данные через HTTP proxy


0

0

Есть 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
То же самое.

Re: Получить данные через HTTP proxy

Забыл сказать.
Пишу на Qt, хочу записать данные в QTextBrowser, но как работать
с http proxy, не нашёл. Решил сформировать запрос и посылать его
на мой прокси. Поэтому perl/etc ... не предлагать.

RomanU ()

Re: Получить данные через HTTP proxy

Ты наверное еще толком не проснулся - пойди кофейку бахни :-)))

> 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-клиента?)

HTH

Onanim ()

Re: Получить данные через HTTP proxy

$ 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) Не используй велосипед(как сказал предыдущий оратор)
Давно уже всё написано до тебя.

Dimez ★★★★★ ()

Re: Получить данные через HTTP proxy

Он почти всё правильно делает...орать не надо, даже если у тебя 5 звёзд...
"Многие знают мого но никто не знает всего" (с) кто то умный сказал

В RFC 2616 (HTTP 1.1) описаны следующие методы: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT.

Так вот многие про этот CONNECT не знают....ну и пусть не знают, олени...

почитать про коннкт тут http://www.nestor.minsk.by/sr/2003/04/30417.html

dlomin ()
Ответ на: Re: Получить данные через HTTP proxy от dlomin

Re: Получить данные через HTTP proxy

2 Dimez and dlomin:

Парни, вы че - тоже не проснулись? :-)))
Вы хоть изначальный постинг асилили?
Человек хочет HTTPS. Причем он правильно понимает,
что для этого ему нужен именно CONNECT через прокси.

Чего он не понимает - так это того, что он должен теперь
сам сделать SSL connection и через него уже посылать свои
запросы. Бузусловно, можно вручную подрочить OpenSSL.
Но быстро кончить не получиться. :-)))
А можно взять готовую библиотеку (libcurl, libwww, ...)
и не иметь геморроя с HTTP протоколом, SSL и прочим
"закатом солнца вручную".

HTH

Onanim ()
Ответ на: Re: Получить данные через HTTP proxy от Onanim

Re: Получить данные через HTTP proxy

2Onanim - полностью с тобой согласен...

Просто RomanU может хочет ручакми поробовать, а потом либу прикрутит...

а Dimez орёт "Читай блин RFC!!!", показывая при этом тест с методом HEAD (хм, не знает про метод CONNECT?)


dlomin ()
Ответ на: Re: Получить данные через HTTP proxy от dlomin

Re: Получить данные через HTTP proxy

Всем спасибо, уже разобрался!

Теперь прокомментирую:)

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 );

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