| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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. Так же присутствует класс-менеджер системного кэша ослика, с возможностью работы только с печеньем. Пример использования:
Содержание аттача: 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 |
| что-то совсем нет желающих потестить видимо народу это не интересно. В новой версии добавлен контроль за скоростью и ее определение. |
| Автор: 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:
но и с 4й версией я что-то не нашел 100% работающей прокси, чтобы протестить... |
| Автор: Ak47black 15.12.2007, 13:16 | ||||
Ммм вот эти строки (TMFWICustomHTTP)
Лучше вверх подвинуть, ато у меня в Delphi 7 некомпилится если они посередине методов вписаны (это скорей изза версии). А если наверх перетянуть (до методов) то компилится. И еше
|
| Автор: MetalFan 15.12.2007, 15:25 |
| мда, не подумал про младшие версии(<D2006), сорь. в след.версии подправлю! спасибо! |
| Автор: Bodrox 9.1.2008, 23:11 |
| Затестим! Давно хотел клиента для https написать |
| Автор: 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 |
| Хм... Хорошая компонента 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. "адаптировать" там элементарно, если конечно сильно надо. |