Russian Qt Forum

Qt => Работа с сетью => Тема начата: troorl от Декабрь 16, 2006, 20:28



Название: Передача данных по https
Отправлено: troorl от Декабрь 16, 2006, 20:28
Программа должна отослать запрос и получить ответ по https. Каким образом это можно реализовать? Нужен наиболее простой вариант, так как функционала особого не надо.


Название: Передача данных по https
Отправлено: Dendy от Декабрь 17, 2006, 00:33
Если я не ошибаюсь, то всё достаточно просто:

Код:

QtSslSocket * socket = new QtSslSocket( QtSslSocket::Cliet );
connect( socket, SIGNAL(connected()), SLOT(connected()) );

...
void This::connected()
{
  QHttp * http = new Http( "www.site.com", 80, this );
  http->setSocket( socket );
  // get OR post
}


Название: Передача данных по https
Отправлено: yshurik от Декабрь 19, 2006, 00:57
Цитата: "Dendy"
Если я не ошибаюсь, то всё достаточно просто:

Код:

QtSslSocket * socket = new QtSslSocket( QtSslSocket::Cliet );
connect( socket, SIGNAL(connected()), SLOT(connected()) );

...
void This::connected()
{
  QHttp * http = new Http( "www.site.com", 80, this );
  http->setSocket( socket );
  // get OR post
}


Вопрос в догонку

Можно ли и как в Qt воспользоваться proxy в данном случае для https?


Название: Передача данных по https
Отправлено: Вудруф от Декабрь 19, 2006, 07:44
+1
Уже задавал вопрос, но ответа так и не получил.

Иными словами, http с proxy работает, а https с proxy - не работает :(


Название: Передача данных по https
Отправлено: troorl от Январь 16, 2007, 18:53
Цитата: "Dendy"
Если я не ошибаюсь, то всё достаточно просто:

Код:

QtSslSocket * socket = new QtSslSocket( QtSslSocket::Cliet );
connect( socket, SIGNAL(connected()), SLOT(connected()) );

...
void This::connected()
{
  QHttp * http = new Http( "www.site.com", 80, this );
  http->setSocket( socket );
  // get OR post
}

Однако я не нашёл в Assistant этого класса. И в /usr/include его нету... Может это для QT3? Потому что я ищё в QT4.


Название: Передача данных по https
Отправлено: Dendy от Январь 16, 2007, 19:58
ЗабьІл сказать. QtSslSocket - класс из солюшенов. Ищите на лесном базаре.


Название: Передача данных по https
Отправлено: troorl от Январь 16, 2007, 20:52
Так это, оно ведь платное и насколько я понимаю, под GPL нельзя использовать эти классы...


Название: Передача данных по https
Отправлено: Dendy от Январь 17, 2007, 01:32
Оно то да. Но никто не мешает подсмотреть исходники и сделать по своему. Исходников там кот наплакал - 60кб два файла с комментариями.


Название: Передача данных по https
Отправлено: troorl от Январь 17, 2007, 20:03
Ок. Пока забудем о лицензиях.
Есть форма ввода пароля. Вот она в упрощённом виде:
Код:

<FORM ACTION="https://bla-bla" METHOD="POST">
<INPUT type=text ID=login NAME=login TABINDEX=1 class=auth SIZE=20 MAXLENGTH=20>
<INPUT align=left ID=p type=password NAME=p TABINDEX=2 class=auth SIZE=19 MAXLENGTH=20>
<INPUT type=image onMouseDown="this.src='../images/logo/3_1_1.gif';";
    onMouseOut="this.src='../images/logo/3_1.gif';" src="../images/logo/3_1.gif" alt='Вход' border=0>
<INPUT type=hidden NAME=scr VALUE='e14a534a6358930b76849224abefded5c6ee431c'>
<INPUT type=hidden NAME=action VALUE='login'>
</FORM>

Вот такие поля она передаёт:
Код:
login
p
src
action

Эта форма работает - логин проходит. Но вот, если логинится из моей программы, мне возвращается та самая форма... Не понимаю, в чём дело. Вот отрезок кода:
Код:

socket->connectToHost("some-host", 443);
my_http->setHost("some-host", 443);
my_http->setSocket(socket);
QHttpRequestHeader header("POST", "/index.spl");
    header.setValue("Host", "some-host");
    header.setContentType("application/x-www-form-urlencoded");
    my_http->request(header, "login=****&p=******&src=58b28b0351e2126466ade74ce709cad9b34e704f&action=login");

Может я где-то опростоволосился?


Название: Передача данных по https
Отправлено: Dendy от Январь 17, 2007, 21:25
Я так понимаю socket - ето QtSslSocket? А разве не нужно подождать, пока пройдет хендшейк? Другими словами - делать QHttp::request() после того как произошел коннект. Сам к HTTPS не коннектился, размьІшляю только теоретически.


Название: Передача данных по https
Отправлено: troorl от Январь 17, 2007, 21:47
Цитата: "Dendy"
Я так понимаю socket - ето QtSslSocket? А разве не нужно подождать, пока пройдет хендшейк? Другими словами - делать QHttp::request() после того как произошел коннект. Сам к HTTPS не коннектился, размьІшляю только теоретически.
Ну по поводу https как такового у меня нет замечаний - форма тоже в в https и она нормально передаётся. А вот как быть с данными, это вопрос... :(


Название: Передача данных по https
Отправлено: nova от Январь 17, 2007, 22:23
А по моему надо так:
Код:

QHttpRequestHeader header("POST", "/index.spl");
header.setValue("Host", "some-host");
header.setValue ("login","***");
header.setValue ("p","***");
header.setValue ("src","58b28b0351e2126466ade74ce709cad9b34e704");
header.setValue ("action","login");
 my_http->request(header);


Название: Передача данных по https
Отправлено: troorl от Январь 18, 2007, 15:19
Цитата: "nova"
А по моему надо так:
Код:

QHttpRequestHeader header("POST", "/index.spl");
header.setValue("Host", "some-host");
header.setValue ("login","***");
header.setValue ("p","***");
header.setValue ("src","58b28b0351e2126466ade74ce709cad9b34e704");
header.setValue ("action","login");
 my_http->request(header);

И так тоже попробовал - тот же результат.
Но вот что интересно: если вводить неправильные данные, то об этом на форме указывается. А у меня никаких ошибок. Это означает, что данные вовсе туда не доходят. Это очень странно...

добавлено спустя 16 часов:

 Я попробовал сделать аналогичную форму у себя на локалхосте. Сделал небольшой питоновский скрипт, который бы выводил переданные значения. Так вот, и из html-формы, и из моей программы данные нормально передаются.
Выходит, что вся загвоздка в ssl-сокете. Но вот куда копать, я без понятия...