Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > новый HTTP клиент на WinInet


Автор: MetalFan 12.12.2007, 01:36
Выношу на ваш суд свое творение: HTTP-клиент основанный на WinInet.
История: после исследования и приобретения опыта использования уже 
существующих наборов компонент(Indy, SwinHTTP, Alcinoe, ICS) для работы с сетью, а в частности работы с http, 
решил под свои задачи написать что-то свое. Сначала были написаны классы-обертки над основными функциями из
WinInet для работы c http-запросами (InternetOpen, InternetConnect, HTTPOpenRequest, etc), затем создан класс
инкапсулирующий в себе работу с этими классами, внешний интерфейс которого напоминает idHTTP
Требования:
1. Умение работать с https без дополнительных библиотек и извратов.
2. Умение отправлять пост-запросом произвольные данные, в т.ч. файлы.
3. Простота в использовании.
Характеристики:
1. Синхронный.
2. Отправка GET,POST,HEAD запросов
3. Возможность отправки TStream в Post-запросе, повзаимствован класс TIdMultipartFormData.
4. Соединение на основе системных настроек, через прокси и "напрямую".
5. Отключение использования системной базы печенья, отключение редиректов.
6. Автоматическое определение https запроса, игнор "кривых" сертификатов безопасности
7. События OnStatus, OnError, OnWorkBegin, OnWorkEnd, OnWork
8. Так же присутствует класс-менеджер системного кэша ослика, с возможностью работы только с печеньем.
Пример использования:
Код

var
  lMFHTTP: TMFWICustomHTTP;
begin
  lMFHTTP := TMFWICustomHTTP.Create( nil );
  try
    lMFHTTP.RequestHeaders.AcceptCharset := 'windows-1251';
    lMFHTTP.RequestParams := lMFHTTP.RequestParams + [hrfReload];
    mem.Lines.Text := lMFHTTP.Get(edtUrl.Text);
    memHdr.Text := lMFHTTP.ResponseHeaders.RawHeaders.Text;
  finally
    lMFHTTP.Free;
  end;

Содержание аттача:
Example - содержит примитивное приложение с примерами использования как оберток, так и самого компонента
Source\Classes - содержит класс-менеджер оберток, собственно клиент http
Source\IndyUtils - в 2х модулях пара классов и десяток функций, повзаимствованных из Indy
Source\Wrappers - модули с классами-обертками над вышеупомянутыми функциями WinInet
Планы по развитию компонент:
1. Создание асинхронного аналога
2. Добавление опции, задающей макс. входящую / исходящую скорость соединения
3. Что-нибудь еще)

Жду конструктивной критики, предложений, замечаний, найденных багов

wbw, MetalFan

History
0.0.1.11: 
+ Добавлена возможность ограничение скорости (SendBytesPerSec,RecvBytesPerSec)
+ Добавлена св-во со значением текущей скорости ConnectionSpeed.

Автор: aktuba 12.12.2007, 01:54
Как я понимаю, из отличий от Indy, только работа с https... Или еще что-то?

Автор: MetalFan 12.12.2007, 10:20
Отличия... 
1. для поддержки печенек не нужно доп.телодвижений. AllowCookies по умолчанию вкл.
2. https, как ты раньше сказал
3. Простота в использовании
4. размер. компактный, как и SwinHTTP.
пустой проект с формой в bds2006 - 393Kb
форма с idHTTP (без дополнений в виде TIdCookieManager, TIdSSLIOHandler.... ) - 583 (+291Kb)
форма с использованием компонента на основе WinInet - 417Kb (+24Kb).

в дальнейшем будут еще различия:
5. "встроенное" в компонент ограничение скорости
6. Асинхронность с использованием возможностей WinInet

Автор: MetalFan 13.12.2007, 01:25
что-то совсем нет желающих потестить   smile 
видимо народу это не интересно.  smile 

В новой версии добавлен контроль за скоростью и ее определение.

Автор: zer0c0o1 14.12.2007, 01:48
очень интересен компонент покажи на примере как взять с хттпс урл через сокс5

Автор: MetalFan 14.12.2007, 09:33
дай пример сокс5 прокси и страничку, которую надо взять) покажу. 5 строк кода)

Автор: zer0c0o1 14.12.2007, 22:04
В indy socks5 я реализовывал вот так:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdSocks, IdIOHandler,
  IdIOHandlerSocket, IdSSLOpenSSL, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdHTTP;

type
  TForm1 = class(TForm)
    Button1: TButton;
    IdHTTP1: TIdHTTP;
    IdSSLIOHandlerSocket1: TIdSSLIOHandlerSocket;
    IdSocksInfo1: TIdSocksInfo;
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
IdSocksInfo1.Version:=svSocks5;
IdSocksInfo1.host:='211.116.254.203';
IdSocksInfo1.Port:=2753;
IdSSLIOHandlerSocket1.SSLOptions.Method:=sslvSSLv23;
IdSSLIOHandlerSocket1.SocksInfo:=IdSocksInfo1;
IdHTTP1.IOHandler:=IdSSLIOHandlerSocket1;
IdHTTP1.Get('https://www.sait.ru/');
end;

end.

Автор: MetalFan 15.12.2007, 09:42
мда, нашел в инете ответ. к сожалению WinInet SOCKS прокси поддерживает только 4е...
ибо в http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=929937&SiteID=1:
Цитата
SOCKS is not a widely used protocol


но и с 4й версией я что-то не нашел 100% работающей прокси, чтобы протестить...

Автор: Ak47black 15.12.2007, 13:16
Ммм вот эти строки (TMFWICustomHTTP)
Код

    //events redirectors
    var
      FLastWorkPos: Int64;
      FStartWorkTime: Cardinal;
    //
    var
      FRequestHdrs: TMFWinInetRequestQueryInfo;
      FResponseHdrs: TMFWinInetRequestQueryInfo;

Лучше вверх подвинуть, ато у меня в Delphi 7 некомпилится если они посередине методов вписаны (это скорей изза версии). А если наверх перетянуть (до методов) то компилится.
И еше 
Цитата

Error reading form.
Свойство pbar.ExplicitLeft

Автор: MetalFan 15.12.2007, 15:25
мда, не подумал про младшие версии(<D2006), сорь. в след.версии подправлю! спасибо!

Автор: Bodrox 9.1.2008, 23:11
Затестим! Давно хотел клиента для https написать smile.

Автор: morlock 19.2.2008, 21:49
Добрый день! Пробую воспользоваться вашим HTTP клиентом.. При попытке отправить POST на url типа http://site.coom/script.php?a=1&b=2&q=45 компонент просто отрубает то что идет после '?' и отправляет просто на script.php

Автор: SneG0K 21.2.2008, 01:19
Хм... Хорошая компонента smile 
MetalFan, молодец... 

Автор: VolRus 1.12.2008, 12:24
У меня delphi 7. Будет ли адаптированая версия?   

 //events redirectors
    var
      FLastWorkPos: Int64;
      FStartWorkTime: Cardinal;

Build
  [Error] WinInet_MFHTTP.pas(79): 'END' expected but 'VAR' found
  [Error] WinInet_MFHTTP.pas(116): Unknown directive: 'public'
  [Error] WinInet_MFHTTP.pas(117): Undeclared identifier: 'Create'
  [Error] WinInet_MFHTTP.pas(117): Unknown directive: 'override'
  [Error] WinInet_MFHTTP.pas(118): Undeclared identifier: 'Destroy'
  [Error] WinInet_MFHTTP.pas(120): Declaration expected but 'PROPERTY' found
  [Error] WinInet_MFHTTP.pas(169): Declaration expected but 'PROPERTY' found
  [Error] WinInet_MFHTTP.pas(183): 'IMPLEMENTATION' expected but ';' found
  [Error] WinInet_MFHTTP.pas(185): '.' expected but 'IMPLEMENTATION' found
  [Error] WinInet_MFHTTP.pas(26): Unsatisfied forward or external declaration: 'TMFProxyParams.GetProxy'
  [Hint] .....
  ....
  [Error] WinInet_MFHTTP.pas(82): Unsatisfied forward or external declaration: 'Delay'
  [Error] WinInet_MFHTTP.pas(83): Unsatisfied forward or external declaration: 'CheckSpeedLimit'
  [Error] WinInet_MFHTTP.pas(84): Unsatisfied forward or external declaration: 'UpdateSpeed'
  [Error] WinInet_MFHTTP.pas(85): Unsatisfied forward or external declaration: 'OnInternalStatus'
  [Error] WinInet_MFHTTP.pas(86): Unsatisfied forward or external declaration: 'OnInternalWorkBegin'
  [Error] WinInet_MFHTTP.pas(87): Unsatisfied forward or external declaration: 'OnInternalWork'
  [Error] WinInet_MFHTTP.pas(88): Unsatisfied forward or external declaration: 'OnInternalWorkEnd'
  [Error] WinInet_MFHTTP.pas(89): Unsatisfied forward or external declaration: 'GetResponseHeaders'
  [Error] WinInet_MFHTTP.pas(90): Unsatisfied forward or external declaration: 'GetProxyParams'
  [Error] WinInet_MFHTTP.pas(91): Unsatisfied forward or external declaration: 'GetVersion'
  [Error] WinInet_MFHTTP.pas(94): Unsatisfied forward or external declaration: 'GetRequestHeaders'
  [Error] WinInet_MFHTTP.pas(96): Unsatisfied forward or external declaration: 'CreateSession'
  [Error] WinInet_MFHTTP.pas(99): Unsatisfied forward or external declaration: 'CreateConnection'
  [Error] WinInet_MFHTTP.pas(103): Unsatisfied forward or external declaration: 'CreateRequest'
  [Error] WinInet_MFHTTP.pas(104): Unsatisfied forward or external declaration: 'FreeRequest'
  [Error] WinInet_MFHTTP.pas(106): Unsatisfied forward or external declaration: 'DoPrepareRequest'
  [Error] WinInet_MFHTTP.pas(107): Unsatisfied forward or external declaration: 'DoSendRequest'
  [Error] WinInet_MFHTTP.pas(108): Unsatisfied forward or external declaration: 'DoGetResponse'
  [Error] WinInet_MFHTTP.pas(110): Unsatisfied forward or external declaration: 'DoGet'
  [Error] WinInet_MFHTTP.pas(112): Unsatisfied forward or external declaration: 'DoPost'
  [Error] WinInet_MFHTTP.pas(114): Unsatisfied forward or external declaration: 'DoHead'
  [Error] WinInet_MFHTTP.pas(117): Unsatisfied forward or external declaration: 'Create'
  [Error] WinInet_MFHTTP.pas(118): Unsatisfied forward or external declaration: 'Destroy'
  [Error] WinInet_MFHTTP.pas(153): Unsatisfied forward or external declaration: 'Get'
  [Error] WinInet_MFHTTP.pas(154): Unsatisfied forward or external declaration: 'Get'
  [Error] WinInet_MFHTTP.pas(155): Unsatisfied forward or external declaration: 'Get'
  [Error] WinInet_MFHTTP.pas(156): Unsatisfied forward or external declaration: 'Get'
  [Error] WinInet_MFHTTP.pas(158): Unsatisfied forward or external declaration: 'Post'
  [Error] WinInet_MFHTTP.pas(159): Unsatisfied forward or external declaration: 'Post'
  [Error] WinInet_MFHTTP.pas(160): Unsatisfied forward or external declaration: 'Post'
  [Error] WinInet_MFHTTP.pas(161): Unsatisfied forward or external declaration: 'Post'
  [Error] WinInet_MFHTTP.pas(162): Unsatisfied forward or external declaration: 'Post'
  [Error] WinInet_MFHTTP.pas(163): Unsatisfied forward or external declaration: 'Post'
  [Error] WinInet_MFHTTP.pas(165): Unsatisfied forward or external declaration: 'Head'
  [Fatal Error] WinInet_GetTestDlg.pas(7): Could not compile used unit '..\..\Source\Classes\WinInet_MFHTTP.pas'

Автор: MetalFan 1.12.2008, 12:46
VolRus, не будет, ибо:
1. нет Д7
2. нет времени
3. "адаптировать" там элементарно, если конечно сильно надо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)