提交 d323fce8 编写于 作者: 报告_前方高能's avatar 报告_前方高能

1.4.4-20230318

上级 1d9d1d7e
2023-03-09 ahttp 集成asynframe-sdk_v1.4.3-20230309 https://github.com/netsecsp/asynframe
2023-03-18 ahttp 集成asynframe-sdk_v1.4.4-20230318 https://github.com/netsecsp/asynframe
> asynframe-sdk_v1.4.3-202300309.zip is from https://github.com/netsecsp/asynframe
> asynframe-sdk_v1.4.4-20230318.zip is from https://github.com/netsecsp/asynframe
# ahttpclient.exe
> supports IPv4/IPv6 http/https client program under windows
......
......@@ -214,20 +214,6 @@ END_ASYN_IOERROR()
#define OB_OsAddr ( 1 ) //OsAddr
#define OB_IoArea ( 2 ) //IoArea
/////////////////////////////////////////////////////////////////////////////////
//IThread.type
#define TT_FrameThread ( 0 ) //IAsynFrameThread
#define TT_WorksThread ( 1 ) //IThread
#define TT_TwinsThread ( 2 ) //IThread
/////////////////////////////////////////////////////////////////////////////////
//IThreadPool.type
#define TP_AutoxThreadpool ( 0 ) //自动调整线程池
#define TP_FixedThreadpool ( 1 ) //固定大小线程池
#define TP_SocksThreadpool ( 2 ) //socket 线程池
#define TP_EventThreadpool ( 3 ) //监控事件线程池
#pragma pack(push, 1)
/////////////////////////////////////////////////////////////////////////////////
typedef struct tag_OSBUFFER_IOAREA
......
......@@ -41,6 +41,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
NAMESPACE_BEGIN(asynsdk)
///////////////////////////////////////////////////////////////////////////////
//添加到空闲的消息队列
HRESULT AppendIdleOperation(/*[in ]*/IAsynIoOperation *lpAsynIoOperation, /*[in ]*/uint32_t param2 = 0);
HRESULT SendAsynIoOperation(/*[in ]*/IAsynIoOperation *lpAsynIoOperation);
......@@ -53,27 +54,35 @@ HRESULT PostBindIoOperation(/*[in ]*/IAsynIoOperation *lpAsynIoOperation, /*[in
///////////////////////////////////////////////////////////////////////////////
//枚举KeyvalSetter数据
void TravelKeyvalSetter ( /*[in ]*/IKeyvalSetter *object, /*[in ]*/IAsynMessageEvents *events );
void TravelKeyvalSetter (/*[in ]*/IKeyvalSetter *object, /*[in ]*/IAsynMessageEvents *events);
///////////////////////////////////////////////////////////////////////////////
//设置读||写速度限制器
bool SetSpeedController (/*[in ]*/IAsynIoDevice *lpDstAsynIoDevice, /*[in ]*/uint32_t type, /*[in ]*/uint32_t level, /*[in ]*/ISpeedController *pSpeedController);
///////////////////////////////////////////////////////////////////////////////
//检测是否ISsl
bool IsSslSocket (/*[in ]*/IUnknown *pSocket);
///////////////////////////////////////////////////////////////////////////////
//申请||释放内存
void *AcquireBuffer(/*[in ]*/IMemoryPool *lpMemorypool, /*[in, out]*/uint32_t *size);
bool ReleaseBuffer(/*[in ]*/IMemoryPool *lpMemorypool, /*[in ]*/void *addr);
///////////////////////////////////////////////////////////////////////////////
//检测是否ISsl
bool IsSslSocket (IUnknown *pSocket);
typedef enum tag_FrameThreadCore
{
TC_Auto = 0,
TC_Iocp,
TC_Uapc,
TC_Uapc_timeEvent,
} FrameThreadCore;
///////////////////////////////////////////////////////////////////////////////
//建立消息循环泵: pParam1==0表示建立异步线程循环泵, 禁止events=0,pParam1!=0表示建立窗口线程循环泵, 允许events=0, 注意: 不能用于模态对话框
void DoMessageLoop(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/handle pParam1, /*[in ]*/uint32_t unused, /*[in ]*/IAsynMessageEvents *events);
void DoMessageLoop(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/handle pParam1, /*[in ]*/FrameThreadCore core, /*[in ]*/IAsynMessageEvents *events);
//创建消息循环泵: pParam1==0表示建立异步线程循环泵, 禁止events=0,pParam1!=0表示建立窗口线程循环泵, 允许events=0, 注意: 可以用于模态对话框, 必须在当前线程创建/运行线程循环泵, 并且禁止events=0
IThreadMessagePump *CreateThreadMessagePump(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/handle pParam1, /*[in ]*/uint32_t unused, /*[in ]*/IAsynMessageEvents *events);
IThreadMessagePump *CreateThreadMessagePump(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/handle pParam1, /*[in ]*/FrameThreadCore core, /*[in ]*/IAsynMessageEvents *events);
///////////////////////////////////////////////////////////////////////////////
//创建数据传输器
......@@ -84,12 +93,25 @@ IDataTransmit *CreateDataTransmit(/*[in ]*/InstancesManager *lpInstancesM
IOsCommand *CreateCommand(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/const char *name, /*[in ]*/IUnknown *thread, /*[in ]*/IUnknown *pParam1, /*[in ]*/uint64_t lparam2);
///////////////////////////////////////////////////////////////////////////////
//创建线程
IThread *CreateThread (/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/const char *name, /*[in ]*/uint32_t type);
typedef enum tag_ThreadType
{
TT_FrameThread = 0, //IAsynFrameThread
TT_WorksThread, //IThread
TT_TwinsThread, //IThread
} ThreadType;
//创建Os线程
IThread *CreateThread(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/const char *name, /*[in ]*/ThreadType type);
///////////////////////////////////////////////////////////////////////////////
typedef enum tag_ThreadpoolType
{
PT_AutoxThreadpool = 0, //自动调整线程池
PT_FixedThreadpool, //固定大小线程池
PT_SocksThreadpool, //socket 线程池
PT_EventThreadpool, //监控事件线程池
} ThreadpoolType;
//创建线程池
IThreadPool *CreateThreadPool(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/const char *name, /*[in ]*/uint32_t type);
IThreadPool *CreateThreadPool(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/const char *name, /*[in ]*/ThreadpoolType type);
///////////////////////////////////////////////////////////////////////////////
//获取frame 目录
......@@ -97,9 +119,9 @@ std::string GetFrameFolderDirectory(/*[in ]*/InstancesManager *lpInstancesManage
///////////////////////////////////////////////////////////////////////////////
//转换编码格式
uint32_t Convert( /*[in ]*/uint32_t nSrcCodepage, /*[in ]*/const char *src, /*[in ]*/uint32_t len, /*out*/std::wstring &dst ); // XXXXX->WCHAR
uint32_t Convert( /*[in ]*/const wchar_t *src, /*[in ]*/uint32_t len, /*[in ]*/uint32_t nDstCodepage, /*out*/std::string &dst ); // WCHAR->XXXXX
uint32_t Convert( /*[in ]*/uint32_t nSrcCodepage, /*[in ]*/const char *src, /*[in ]*/uint32_t len, /*[in ]*/uint32_t nDstCodepage, /*out*/std::string &dst ); //XXXXX->XXXXX
uint32_t Convert(/*[in ]*/uint32_t nSrcCodepage, /*[in ]*/const char *src, /*[in ]*/uint32_t len, /*out*/std::wstring &dst); // XXXXX->WCHAR
uint32_t Convert(/*[in ]*/const wchar_t *src, /*[in ]*/uint32_t len, /*[in ]*/uint32_t nDstCodepage, /*out*/std::string &dst); // WCHAR->XXXXX
uint32_t Convert(/*[in ]*/uint32_t nSrcCodepage, /*[in ]*/const char *src, /*[in ]*/uint32_t len, /*[in ]*/uint32_t nDstCodepage, /*out*/std::string &dst); //XXXXX->XXXXX
NAMESPACE_END(asynsdk)
......
#aftpx client configure file
#ahttp client configure file
#############################
[proxy]
#代理配置: none/http1.1/socks4.0 4.a 5.0
protocol=none
version=1.1
version=5.0
host=127.0.0.1
port=8080
port=1080
user=alex
password=123456
[session]
#下载限速,B/s
max_recvspeed=-1
#传输模式: 0-主动 1-被动
pasv=1
#文件名字
filename=
[account]
user=anonymous
password=IEUser@
password=123456
\ No newline at end of file
......@@ -166,13 +166,13 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\src\Downloader.cpp" />
<ClCompile Include="..\..\src\http_Downloader.cpp" />
<ClCompile Include="..\..\src\Main.cpp" />
<ClCompile Include="..\..\src\setting.cpp" />
<ClCompile Include="..\..\src\stdafx.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\src\Downloader.h" />
<ClInclude Include="..\..\src\http_Downloader.h" />
<ClInclude Include="..\..\src\setting.h" />
<ClInclude Include="..\..\src\stdafx.h" />
</ItemGroup>
......
......@@ -163,13 +163,13 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\src\Downloader.cpp" />
<ClCompile Include="..\..\src\http_Downloader.cpp" />
<ClCompile Include="..\..\src\Main.cpp" />
<ClCompile Include="..\..\src\setting.cpp" />
<ClCompile Include="..\..\src\stdafx.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\src\Downloader.h" />
<ClInclude Include="..\..\src\http_Downloader.h" />
<ClInclude Include="..\..\src\setting.h" />
<ClInclude Include="..\..\src\stdafx.h" />
</ItemGroup>
......
......@@ -60,7 +60,7 @@ IDR_Application ICON DISCARDABLE "exe_ahttp.ico"
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,4,3,3
FILEVERSION 1,4,4,4
PRODUCTVERSION 1,0,0,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
......@@ -78,7 +78,7 @@ BEGIN
BEGIN
VALUE "CompanyName", "http://ahttp.sf.net"
VALUE "FileDescription", "ahttpclient"
VALUE "FileVersion", "1, 4, 3, 3"
VALUE "FileVersion", "1, 4, 4, 4"
VALUE "InternalName", "ahttpclient"
VALUE "LegalCopyright", "Copyright (c) netsecsp 2012-2032"
VALUE "OriginalFilename", "ahttpclient.exe"
......
......@@ -34,7 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define AAPIDLL_USING
#include "Downloader.h"
#include "http_Downloader.h"
#ifdef AAPIDLL_USING
#include <frame/asm/ITypedef_i.c>
......@@ -59,40 +59,30 @@ STDAPI_(extern HRESULT) Initialize( /*[in ]*/IAsynMessageEvents *param1, /*[in ]
STDAPI_(extern HRESULT) Destory();
STDAPI_(extern InstancesManager *) GetInstancesManager();
static void ShowUsage(const char *name)
static void ShowUsage(std::string name)
{
printf("usage: %s -4/6 url [offset]\n\texample: %s -4 http[s]://www.baidu.com/index.html\n\tplease check config.txt for proxy\n\n", name, name);
std::string::size_type i = name.find_last_of("/\\");
if( i != std::string::npos )
name.erase(0, i + 1);
printf(" Usage: %s [-4|6] [-s tls/1.0] [-referurl URL] [-u PROXYURL] [-c OFFSET] [-o FILE] http[s]://[user:password@]host[:port]/path/file\n", name.c_str());
printf("Options:\n");
printf(" -4 Enforce IPv4\n");
printf(" -6 Enforce IPv6\n");
printf(" -s use TLS or SSL\n");
printf(" -referurl use refer url\n");
printf(" -u use proxy url, protocol://[user:password@]host[:port]/ver?params\n");
printf(" -c continue-at OFFSET Resumed transfer OFFSET\n");
printf(" -o save FILE\n");
printf("example: %s -4 \"http://localhost/test.exe\"\n", name.c_str());
}
int _tmain(int argc, _TCHAR *argv[])
int main(int argc, const char *argv[])
{
printf("Copyright (c) netsecsp 2012-2032, All rights reserved.\n");
printf("Developer: Shengqian Yang, from China, E-mail: netsecsp@hotmail.com, last updated " STRING_UPDATETIME "\n");
printf("http://ahttp.sf.net\n\n");
char *httpurl = "http://www.baidu.com/index.html", ipvx = '4', *pOffset = "0";
for(int i = 1; i < argc; ++ i)
{
if( strcmp(argv[i], "/?") == 0 ||
strcmp(argv[i], "--help") == 0 )
{
ShowUsage(argv[0]);
return 0;
}
if( argv[i][0] == '-' )
{
ipvx = argv[i][1];
}
else
{
if( isdigit(argv[i][0]) )
pOffset = argv[i];
else
httpurl = argv[i];
}
}
if( Initialize(NULL, NULL) != NO_ERROR )
{
printf("fail to Initialize asynframe\n");
......@@ -110,24 +100,29 @@ int _tmain(int argc, _TCHAR *argv[])
}
CComPtr<IAsynFrameThread> spAsynFrameThread;
lpInstancesManager->NewInstance(0, 0, IID_IAsynFrameThread, (void **)&spAsynFrameThread);
lpInstancesManager->NewInstance(0, TC_Iocp, IID_IAsynFrameThread, (void **)&spAsynFrameThread);
HANDLE hNotify = ::CreateEvent(0, 1, 0, 0);
std::unique_ptr<CDownloader> pDownloader(new CDownloader(hNotify, lpInstancesManager, spAsynFrameThread, ipvx == '4'? 2 : 23));
if (pDownloader->Start(httpurl, _atoi64(pOffset)))
std::unique_ptr<CHttpDownloader> downloader(new CHttpDownloader(lpInstancesManager, spAsynFrameThread));
const char *httpurl = downloader->Parse(argc, argv);
if(!httpurl )
{
ShowUsage(argv[0]);
}
else
{
while( WAIT_OBJECT_0 != ::WaitForSingleObject(hNotify, 0) &&
_kbhit() == 0 )
if( downloader->Start(httpurl))
{
Sleep(100); //0.1sec
while( WAIT_OBJECT_0 != ::WaitForSingleObject(downloader->m_hNotify, 0) &&
_kbhit() == 0 )
{
Sleep(100); //0.1sec
}
}
}
pDownloader->Shutdown();
::CloseHandle( hNotify);
}while(0);
downloader->Shutdown();
}while(0);
if( Destory() != NO_ERROR )
if( Destory() != NO_ERROR)
{
printf("fail to Destory asynframe\n");
}
......
......@@ -30,18 +30,18 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
#include "stdafx.h"
#include "Downloader.h"
#include "http_Downloader.h"
#include <frame/asm/ISsl.h>
BEGIN_ASYN_MESSAGE_MAP(CDownloader)
BEGIN_ASYN_MESSAGE_MAP(CHttpDownloader)
ON_IOMSG_NOTIFY(OnIomsgNotify)
ON_EVENT_NOTIFY(OnEventNotify, IAsynIoOperation)
ON_QUERY_RESULT(OnQueryResult, IUnknown)
END_ASYN_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
HRESULT CDownloader::OnQueryResult( uint64_t lParam1, uint64_t lParam2, IUnknown **objects )
HRESULT CHttpDownloader::OnQueryResult( uint64_t lParam1, uint64_t lParam2, IUnknown **objects )
{
if( lParam1 == 0 )
if(!lParam1 )
{
asynsdk::CStringSetter d(1);
asynsdk::CMemorySetter c((void*)0);
......@@ -49,8 +49,7 @@ HRESULT CDownloader::OnQueryResult( uint64_t lParam1, uint64_t lParam2, IUnknown
((IKeyvalSetter*)objects[0])->Get(STRING_from_string(";context"), 0, 0, &c);
if( d.m_val.rfind("cert.verify") != std::string::npos )
{// cert.verify
ISsl *pSsl = (ISsl*)lParam2;
return pSsl->VerifyPeerCertificate(*(handle*)c.m_val.ptr, 0x1000);
return ((ISsl*)lParam2)->VerifyPeerCertificate(*(handle*)c.m_val.ptr, 0x1000);
}
return E_NOTIMPL;
}
......@@ -68,10 +67,10 @@ HRESULT CDownloader::OnQueryResult( uint64_t lParam1, uint64_t lParam2, IUnknown
if( bCompleted ) m_datasize = 0; //mark download complete
return m_datasize != 0 ? S_OK : S_FALSE;
return m_datasize != 0? S_OK : S_FALSE;
}
HRESULT CDownloader::OnIomsgNotify( uint64_t lParam1, uint64_t lAction, IAsynIoOperation *lpAsynIoOperation )
HRESULT CHttpDownloader::OnIomsgNotify( uint64_t lParam1, uint64_t lAction, IAsynIoOperation *lpAsynIoOperation )
{
uint32_t lErrorCode = NO_ERROR, lTransferedBytes;
lpAsynIoOperation->GetCompletedResult(&lErrorCode, &lTransferedBytes, 0);
......@@ -88,23 +87,22 @@ HRESULT CDownloader::OnIomsgNotify( uint64_t lParam1, uint64_t lAction, IAsynIoO
}
else
{
std::string host; asynsdk::CStringSetterRef temp(1, &host);
PORT port;
asynsdk::CStringSetter host(1);
PORT port;
{// 打印链接信息
CComPtr<IAsynNetIoOperation> spAsynIoOperation;
lpAsynIoOperation->QueryInterface(IID_IAsynNetIoOperation, (void **)&spAsynIoOperation);
spAsynIoOperation->GetPeerAddress(&temp, 0, &port, &m_af);
printf("connected %s:%d[%s]\n", host.c_str(), port, m_af == AF_INET ? "ipv4" : "ipv6");
spAsynIoOperation->GetPeerAddress(&host, 0, &port, &m_af);
printf("connected %s:%d[%s]\n", host.m_val.c_str(), port, m_af == AF_INET ? "ipv4" : "ipv6");
}
asynsdk::CKeyvalSetter params(1);
//params.Set(STRING_from_string("User-Agent"), 1, STRING_from_string("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"));
params.Set(STRING_from_string("Accept" ), 1, STRING_from_string("*/*"));
const std::string &szreferurl = m_setsfile.get_string("session", "referurl");
if( szreferurl.empty() == false ) params.Set(STRING_from_string("Referer"), 1, STRING_from_string(szreferurl));
if( m_referurl ) params.Set(STRING_from_string("Referer"), 1, STRING_from_string(m_referurl));
if( m_startpos != 0 )
if( m_startpos )
{
char temp[64]; sprintf_s(temp, 64, "bytes=%I64d-", m_startpos);
params.Set(STRING_from_string("Range" ), 1, STRING_from_string(temp));
......@@ -169,7 +167,7 @@ HRESULT CDownloader::OnIomsgNotify( uint64_t lParam1, uint64_t lAction, IAsynIoO
}
}
if( m_datasize == 0 ) //filesize is zero
if( m_datasize == 0 ) //filesize is zero
{
printf("%s is zero\n", m_filename.c_str());
SetEvent(m_hNotify);
......@@ -228,7 +226,7 @@ HRESULT CDownloader::OnIomsgNotify( uint64_t lParam1, uint64_t lAction, IAsynIoO
return E_NOTIMPL; //通知系统释放lpAsynIoOperation
}
HRESULT CDownloader::OnEventNotify( uint64_t lParam1, uint64_t lParam2, IAsynIoOperation *lpAsynIoOperation )
HRESULT CHttpDownloader::OnEventNotify( uint64_t lParam1, uint64_t lParam2, IAsynIoOperation *lpAsynIoOperation )
{
if( m_spAsynIoBridge != (IAsynIoBridge *)lParam1) return S_OK;
......
#ifndef __DOWNLOADER_H__
#define __DOWNLOADER_H__
#ifndef __HTTPDOWNLOADER_H__
#define __HTTPDOWNLOADER_H__
/*****************************************************************************
Copyright (c) netsecsp 2012-2032, All rights reserved.
......@@ -38,42 +38,236 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "setting.h"
using namespace asynsdk;
class CDownloader : public asyn_message_events_impl
class CHttpDownloader : public asyn_message_events_impl
{
public:
CDownloader(HANDLE hNotify, InstancesManager *lpInstanceManager, IAsynFrameThread *lpAsynFrameThread, uint32_t af = AF_INET)
: m_af(af), m_hNotify(hNotify), m_setsfile("config.txt")
CHttpDownloader(InstancesManager *lpInstanceManager, IAsynFrameThread *lpAsynFrameThread)
: m_setsfile("proxy.txt"), m_af(AF_INET), m_startpos(0), m_hNotify(::CreateEvent(0, 1, 0, 0))
{
m_spInstanceManager = lpInstanceManager;
m_spAsynFrameThread = lpAsynFrameThread;
m_spInstanceManager->GetInstance(STRING_from_string(IN_AsynNetwork), IID_IAsynNetwork, (void **)&m_spAsynNetwork);
CreateAsynFrame(m_spAsynFrameThread, 0, &m_spAsynFrame);
}
virtual ~CHttpDownloader()
{
CloseHandle(m_hNotify);
}
public: // interface of asyn_message_events_impl
DECLARE_ASYN_MESSAGE_MAP(CDownloader)
DECLARE_ASYN_MESSAGE_MAP(CHttpDownloader)
HRESULT OnIomsgNotify( uint64_t lParam1, uint64_t lParam2, IAsynIoOperation *lpAsynIoOperation );
HRESULT OnEventNotify( uint64_t lParam1, uint64_t lAction, IAsynIoOperation *lpAsynIoOperation );
HRESULT OnQueryResult( uint64_t lParam1, uint64_t lAction, IUnknown **objects );
public:
bool Start(const std::string &url, uint64_t startpos)
const char *Parse(int argc, const char *argv[])
{
//url格式, protocol://[user:password@]host[:port]/path/[;parameters][?query]#fragment
const char *httpurl = 0;
for(int i = 1; i < argc; ++ i)
{
if( strcmp(argv[i], "/?") == 0 ||
strcmp(argv[i], "--help") == 0 )
{
httpurl = 0;
break;
}
if( argv[i][0] == '-' )
{
if( strcmp(argv[i], "-referurl") == 0 )
{
if( argc > ++ i)
m_referurl = argv[i];
continue;
}
if( strcmp(argv[i], "-4") == 0 )
{
m_af = AF_INET;
continue;
}
if( strcmp(argv[i], "-6") == 0 )
{
m_af = 23;
continue;
}
if( strcmp(argv[i], "-c") == 0 )
{
if( argc > ++ i)
m_startpos = _atoi64(argv[i]);
continue;
}
if( strcmp(argv[i], "-s") == 0 )
{
if( argc > ++ i)
m_setsfile.set_string("ssl", "algo", argv[i]);
continue;
}
if( strcmp(argv[i], "-o") == 0 )
{
if( argc > ++ i)
m_savename = argv[i];
continue;
}
if( strcmp(argv[i], "-u") == 0 )
{
if( argc > ++ i)
{// protocol://[user:password@]host[:port]/ver?params
std::string tmpurl = argv[i];
std::string::size_type pos1 = tmpurl.find("://");
if( pos1 == std::string::npos )
{
continue;
}
std::string schema = tmpurl.substr(0, pos1);
_strlwr_s((char*)schema.c_str(), schema.size() + 1);
if( schema != "http" &&
schema != "socks" )
{
continue;
}
else
{
pos1 += 3;
}
m_setsfile.set_string("proxy", "protocol", schema);
std::string::size_type pos2 = tmpurl.find('/', pos1);
std::string hostport; //[user:password@]host[:port]
if( pos2 == std::string::npos )
{
hostport = tmpurl.substr(pos1);
}
else
{// ver?params
hostport = tmpurl.substr(pos1, pos2 - pos1);
pos2 += 1;
std::string::size_type post = tmpurl.find_first_of("?=", pos2);
if( post == std::string::npos )
{
m_setsfile.set_string("proxy", "version", tmpurl.substr(pos2));
}
else
{
std::string params;
if( tmpurl[post] != '?' )
{
params = tmpurl.substr(pos2);
}
else
{
params = tmpurl.substr(post + 1);
m_setsfile.set_string("proxy", "version", tmpurl.substr(pos2, post - pos2));
}
std::string::size_type poss = params.find("method=");
if( poss != std::string::npos )
{
poss += 7;
std::string::size_type pose = params.find('&');
if( pose == std::string::npos )
{
m_setsfile.set_string("proxy", "method", params.substr(poss));
}
else
{
m_setsfile.set_string("proxy", "method", params.substr(poss, pose - poss));
}
}
}
}
std::string::size_type pos3 = hostport.find('@');
if( pos3 != std::string::npos )
{
std::string account = hostport.substr(0, pos3);
hostport.erase(0, pos3 + 1);
std::string::size_type post = account.find(':');
if( post == std::string::npos )
{
m_setsfile.set_string("proxy", "user", account);
}
else
{
m_setsfile.set_string("proxy", "user", account.substr(0, post));
m_setsfile.set_string("proxy", "password", account.substr(post + 1));
}
}
std::string::size_type pos4 = hostport.find(':');
if( pos4 == std::string::npos )
{
m_setsfile.set_string("proxy", "host", hostport);
}
else
{
m_setsfile.set_string("proxy", "host", hostport.substr(0, pos4));
m_setsfile.set_string("proxy", "port", hostport.substr(pos4 + 1));
}
}
continue;
}
}
else
{
std::string tmpurl = argv[i];
std::string::size_type pos1 = tmpurl.find("://");
if( pos1 == std::string::npos )
{
continue;
}
std::string schema = tmpurl.substr(0, pos1);
_strlwr_s((char*)schema.c_str(), schema.size() + 1);
if( schema != "http" &&
schema != "https" &&
schema != "ftp" &&
schema != "ftps" )
{
continue;
}
else
{
httpurl = argv[i];
}
}
}
return httpurl;
}
bool Start(std::string url)
{// url格式, protocol://[user:password@]host[:port]/path/[;parameters][?query]#fragment
m_spInstanceManager->NewInstance(0, 0, IID_ISpeedController, (void **)&m_spSpeedController);
std::string::size_type pos1 = url.find("://");
if( pos1 == std::string::npos )
{
printf("fail to parse %s\n", url.c_str());
return false;
}
std::string schema = url.substr(0, pos1);
pos1 += 3/*skip "://" */;
_strlwr_s((char*)schema.c_str(), schema.size() + 1);
if( schema != "http" && schema != "https" && schema != "ftp" && schema != "ftps" )
if( schema != "http" &&
schema != "https" &&
schema != "ftp" &&
schema != "ftps" )
{
printf("invalid schema: %s\n", url.c_str());
printf("fail to parse %s\n", url.c_str());
return false;
}
else
{
pos1 += 3;
}
std::string::size_type pos2 = url.find('/', pos1);
......@@ -88,26 +282,24 @@ public:
hostport = url.substr(pos1, pos2 - pos1);
std::string::size_type pos3 = url.find_first_of(";?#", pos2 + 1);
m_filepath = pos3 == std::string::npos ? url.substr(pos2) : url.substr(pos2, pos3 - pos2);
m_filepath = pos3 == std::string::npos? url.substr(pos2) : url.substr(pos2, pos3 - pos2);
std::string::size_type pos4 = m_filepath.rfind('/');
m_filename = m_filepath.substr(pos4 + 1);
}
if( m_filename.empty()) m_filename = "index.html";
if( m_filename.empty())
m_filename = "index.html";
std::string::size_type pos3 = hostport.find('@');
if( pos3 == std::string::npos )
{
pos3 = 0;
}
else
if( pos3 != std::string::npos )
{
pos3 += 1;
hostport.erase(0, pos3 + 1);
}
std::string::size_type pos4 = hostport.find(':', pos3);
std::string::size_type pos4 = hostport.find(':');
if( pos4 == std::string::npos )
{
m_host = hostport.substr(pos3);
m_host = hostport;
m_port = 80;
if( schema == "https") m_port = 443;
if( schema == "ftp" ) m_port = 21;
......@@ -115,12 +307,12 @@ public:
}
else
{
m_host = hostport.substr(pos3, pos4 - pos3);
m_port = atoi(hostport.substr(pos4 + 1).c_str());
m_host = hostport.substr(0, pos4);
m_port = (PORT)atoi(hostport.substr(pos4 + 1).c_str());
}
m_startpos = startpos;
m_savename = m_setsfile.get_string("session", "filename", m_filename);
if( m_savename.empty())
m_savename = m_filename;
std::string proxyname = m_setsfile.get_string("proxy", "protocol", "none");
if( proxyname != "none" &&
......@@ -137,7 +329,7 @@ public:
CComPtr<IAsynRawSocket> spAsynPtlSocket;
if( proxyname == "none" )
{// 没有配置代理的情况: non
m_spAsynNetwork->CreateAsynPtlSocket( STRING_from_string("http"), (IUnknown **)&spAsynInnSocket.p, STRING_from_string(schema == "http" || schema == "ftp"? ("tcp/1.1") : (schema == "ftps"? "tls/1.1" : "ssl/1.1")/*tcp:表示http/ftp ssl:表示https/ftps*/), &spAsynPtlSocket);
m_spAsynNetwork->CreateAsynPtlSocket( STRING_from_string("http"), (IUnknown **)&spAsynInnSocket.p, STRING_from_string(schema == "http" || schema == "ftp"? "tcp" : m_setsfile.get_string("ssl", "algo", "tls/1.0")), &spAsynPtlSocket);
if( spAsynPtlSocket == NULL )
{
printf("can't load plugin: http\n");
......@@ -150,11 +342,11 @@ public:
{// http.proxy
if( memcmp(schema.c_str(), "http", 4) == 0 )
{
m_spAsynNetwork->CreateAsynPtlSocket( STRING_from_string("proxy"), (IUnknown **)&spAsynInnSocket.p, STRING_from_string( schema + "/" + m_setsfile.get_string("proxy", "version")), &spAsynPtlSocket );
m_spAsynNetwork->CreateAsynPtlSocket( STRING_from_string("proxy"), (IUnknown **)&spAsynInnSocket.p, STRING_from_string( schema + "/" + m_setsfile.get_string("proxy", "version", "1.1")), &spAsynPtlSocket );
}
else
{
m_spAsynNetwork->CreateAsynPtlSocket( STRING_from_string("proxy"), (IUnknown **)&spAsynInnSocket.p, STRING_from_string(proxyname + "/" + m_setsfile.get_string("proxy", "version")), &spAsynPtlSocket );
m_spAsynNetwork->CreateAsynPtlSocket( STRING_from_string("proxy"), (IUnknown **)&spAsynInnSocket.p, STRING_from_string(proxyname + "/" + m_setsfile.get_string("proxy", "version", "1.1")), &spAsynPtlSocket );
}
if( spAsynPtlSocket == NULL )
{
......@@ -169,7 +361,7 @@ public:
asynsdk::CKeyvalSetter params(1);
params.Set(STRING_from_string(";account"), 1, STRING_from_string(m_setsfile.get_string("proxy", "user") + ":" + m_setsfile.get_string("proxy", "password")));
HRESULT hr = spProxy->SetProxyContext(STRING_from_string(m_setsfile.get_string("proxy", "host", "127.0.0.1")), schema!="https"? (PORT)m_setsfile.get_long("proxy", "port", 8080) : (PORT)m_setsfile.get_long("proxy", "port_2", 8443), STRING_EX::null, &params);
HRESULT hr = spProxy->SetProxyContext(STRING_from_string(m_setsfile.get_string("proxy", "host", "127.0.0.1")), schema!="https"? (PORT)m_setsfile.get_long("proxy", "port", 8080) : (PORT)m_setsfile.get_long("proxy", "port", 8443), STRING_from_string(m_setsfile.get_string("proxy", "method", "")), &params);
}
else
{// socks.proxy
......@@ -180,7 +372,7 @@ public:
}
CComPtr<IAsynRawSocket> spAsynTmpSocket;
m_spAsynNetwork->CreateAsynPtlSocket( STRING_from_string("proxy"), (IUnknown **)&spAsynInnSocket.p, STRING_from_string(proxyname + "/" + m_setsfile.get_string("proxy", "version")), &spAsynTmpSocket );
m_spAsynNetwork->CreateAsynPtlSocket( STRING_from_string("proxy"), (IUnknown **)&spAsynInnSocket.p, STRING_from_string(proxyname + "/" + m_setsfile.get_string("proxy", "version", "5.0")), &spAsynTmpSocket );
if( spAsynTmpSocket == NULL )
{
printf("can't load plugin: proxy.%s\n", proxyname.c_str());
......@@ -192,9 +384,9 @@ public:
asynsdk::CKeyvalSetter params(1);
params.Set(STRING_from_string(";account"), 1, STRING_from_string(m_setsfile.get_string("proxy", "user") + ":" + m_setsfile.get_string("proxy", "password")));
HRESULT hr = spProxy->SetProxyContext(STRING_from_string(m_setsfile.get_string("proxy", "host", "127.0.0.1")), (PORT)m_setsfile.get_long("proxy", "port", 1080), STRING_EX::null, &params);
HRESULT hr = spProxy->SetProxyContext(STRING_from_string(m_setsfile.get_string("proxy", "host", "127.0.0.1")), (PORT)m_setsfile.get_long("proxy", "port", 1080), STRING_from_string(m_setsfile.get_string("proxy", "method", "")), &params);
m_spAsynNetwork->CreateAsynPtlSocket(STRING_from_string("http"), (IUnknown **)&spAsynTmpSocket.p, STRING_from_string(schema=="http"? "tcp/1.1" : "ssl/1.1"), &spAsynPtlSocket );
m_spAsynNetwork->CreateAsynPtlSocket(STRING_from_string("http"), (IUnknown **)&spAsynTmpSocket.p, STRING_from_string(schema=="http"? "tcp/1.1" : m_setsfile.get_string("ssl", "algo", "tls/1.0")), &spAsynPtlSocket );
if( spAsynPtlSocket == NULL )
{
printf("can't load plugin: http\n");
......@@ -203,23 +395,28 @@ public:
}
}
spAsynPtlSocket->QueryInterface(IID_IAsynTcpSocket, (void **)&m_spAsynTcpSocket);
//设置接收数据速度: B/s
m_spInstanceManager->NewInstance(0, 0, IID_ISpeedController, (void **)&m_spSpeedController);
m_spSpeedController->SetMaxSpeed(m_setsfile.get_long("session", "max_recvspeed", -1));
bool ret = asynsdk::SetSpeedController(m_spAsynTcpSocket, Io_recv, -1, m_spSpeedController);
asynsdk::SetSpeedController(spAsynPtlSocket, Io_recv, -1, m_spSpeedController);
spAsynPtlSocket->QueryInterface(IID_IAsynTcpSocket, (void **)&m_spAsynTcpSocket);
m_spAsynTcpSocket->Open(m_spAsynFrameThread, m_af, SOCK_STREAM, IPPROTO_TCP);
//开始连接...
CComPtr<IAsynNetIoOperation> spAsynIoOperation;
m_spAsynNetwork->CreateAsynIoOperation(m_spAsynFrame, m_af, 0, IID_IAsynNetIoOperation, (void **)&spAsynIoOperation);
if( proxyname == "none" )
{
printf("start to connect %s:%d\n", m_host.c_str(), m_port);
}
else
printf("start to connect %s:%d via %s-proxyserver[%s:%d]\n", m_host.c_str(), m_port, proxyname.c_str(), m_setsfile.get_string("proxy", "host", "127.0.0.1").c_str(), m_setsfile.get_long("proxy", "port", 1080));
{
const PORT port = (PORT)m_setsfile.get_long("proxy", "port", 0);
if( port )
printf("start to connect %s:%d via %s-proxyserver[%s:%d]\n", m_host.c_str(), m_port, proxyname.c_str(), m_setsfile.get_string("proxy", "host", "127.0.0.1").c_str(), port);
else
printf("start to connect %s:%d via %s-proxyserver[%s]\n", m_host.c_str(), m_port, proxyname.c_str(), m_setsfile.get_string("proxy", "host", "127.0.0.1").c_str());
}
CComPtr<IAsynNetIoOperation> spAsynIoOperation;
m_spAsynNetwork->CreateAsynIoOperation(m_spAsynFrame, 0, 0, IID_IAsynNetIoOperation, (void **)&spAsynIoOperation);
m_spAsynTcpSocket->Connect(STRING_from_string(m_host), m_port, 0, spAsynIoOperation, m_setsfile.get_long("session", "connect_timeout", 2000/*2sec*/));
return true;
}
......@@ -235,7 +432,6 @@ protected:
CComPtr<IAsynFrameThread> m_spAsynFrameThread;
CComPtr<IAsynFrame > m_spAsynFrame;
CComPtr<IAsynNetwork > m_spAsynNetwork;
HANDLE m_hNotify;
CComPtr<ISpeedController> m_spSpeedController;
uint32_t m_starttime;
......@@ -247,12 +443,16 @@ protected:
std::string m_host;
PORT m_port;
const char *m_referurl;
setting m_setsfile;
std::string m_filename;
std::string m_filepath;
std::string m_savename;
uint64_t m_datasize; //尚未接收数据的长度
uint64_t m_startpos; //从0开始
uint64_t m_startpos; //从0开始
public:
HANDLE m_hNotify;
};
#endif//__DOWNLOADER_H__
#endif//__HTTPDOWNLOADER_H__
......@@ -214,20 +214,6 @@ END_ASYN_IOERROR()
#define OB_OsAddr ( 1 ) //OsAddr
#define OB_IoArea ( 2 ) //IoArea
/////////////////////////////////////////////////////////////////////////////////
//IThread.type
#define TT_FrameThread ( 0 ) //IAsynFrameThread
#define TT_WorksThread ( 1 ) //IThread
#define TT_TwinsThread ( 2 ) //IThread
/////////////////////////////////////////////////////////////////////////////////
//IThreadPool.type
#define TP_AutoxThreadpool ( 0 ) //自动调整线程池
#define TP_FixedThreadpool ( 1 ) //固定大小线程池
#define TP_SocksThreadpool ( 2 ) //socket 线程池
#define TP_EventThreadpool ( 3 ) //监控事件线程池
#pragma pack(push, 1)
/////////////////////////////////////////////////////////////////////////////////
typedef struct tag_OSBUFFER_IOAREA
......
......@@ -41,6 +41,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
NAMESPACE_BEGIN(asynsdk)
///////////////////////////////////////////////////////////////////////////////
//添加到空闲的消息队列
HRESULT AppendIdleOperation(/*[in ]*/IAsynIoOperation *lpAsynIoOperation, /*[in ]*/uint32_t param2 = 0);
HRESULT SendAsynIoOperation(/*[in ]*/IAsynIoOperation *lpAsynIoOperation);
......@@ -53,27 +54,35 @@ HRESULT PostBindIoOperation(/*[in ]*/IAsynIoOperation *lpAsynIoOperation, /*[in
///////////////////////////////////////////////////////////////////////////////
//枚举KeyvalSetter数据
void TravelKeyvalSetter ( /*[in ]*/IKeyvalSetter *object, /*[in ]*/IAsynMessageEvents *events );
void TravelKeyvalSetter (/*[in ]*/IKeyvalSetter *object, /*[in ]*/IAsynMessageEvents *events);
///////////////////////////////////////////////////////////////////////////////
//设置读||写速度限制器
bool SetSpeedController (/*[in ]*/IAsynIoDevice *lpDstAsynIoDevice, /*[in ]*/uint32_t type, /*[in ]*/uint32_t level, /*[in ]*/ISpeedController *pSpeedController);
///////////////////////////////////////////////////////////////////////////////
//检测是否ISsl
bool IsSslSocket (/*[in ]*/IUnknown *pSocket);
///////////////////////////////////////////////////////////////////////////////
//申请||释放内存
void *AcquireBuffer(/*[in ]*/IMemoryPool *lpMemorypool, /*[in, out]*/uint32_t *size);
bool ReleaseBuffer(/*[in ]*/IMemoryPool *lpMemorypool, /*[in ]*/void *addr);
///////////////////////////////////////////////////////////////////////////////
//检测是否ISsl
bool IsSslSocket (IUnknown *pSocket);
typedef enum tag_FrameThreadCore
{
TC_Auto = 0,
TC_Iocp,
TC_Uapc,
TC_Uapc_timeEvent,
} FrameThreadCore;
///////////////////////////////////////////////////////////////////////////////
//建立消息循环泵: pParam1==0表示建立异步线程循环泵, 禁止events=0,pParam1!=0表示建立窗口线程循环泵, 允许events=0, 注意: 不能用于模态对话框
void DoMessageLoop(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/handle pParam1, /*[in ]*/uint32_t unused, /*[in ]*/IAsynMessageEvents *events);
void DoMessageLoop(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/handle pParam1, /*[in ]*/FrameThreadCore core, /*[in ]*/IAsynMessageEvents *events);
//创建消息循环泵: pParam1==0表示建立异步线程循环泵, 禁止events=0,pParam1!=0表示建立窗口线程循环泵, 允许events=0, 注意: 可以用于模态对话框, 必须在当前线程创建/运行线程循环泵, 并且禁止events=0
IThreadMessagePump *CreateThreadMessagePump(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/handle pParam1, /*[in ]*/uint32_t unused, /*[in ]*/IAsynMessageEvents *events);
IThreadMessagePump *CreateThreadMessagePump(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/handle pParam1, /*[in ]*/FrameThreadCore core, /*[in ]*/IAsynMessageEvents *events);
///////////////////////////////////////////////////////////////////////////////
//创建数据传输器
......@@ -84,12 +93,25 @@ IDataTransmit *CreateDataTransmit(/*[in ]*/InstancesManager *lpInstancesM
IOsCommand *CreateCommand(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/const char *name, /*[in ]*/IUnknown *thread, /*[in ]*/IUnknown *pParam1, /*[in ]*/uint64_t lparam2);
///////////////////////////////////////////////////////////////////////////////
//创建线程
IThread *CreateThread (/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/const char *name, /*[in ]*/uint32_t type);
typedef enum tag_ThreadType
{
TT_FrameThread = 0, //IAsynFrameThread
TT_WorksThread, //IThread
TT_TwinsThread, //IThread
} ThreadType;
//创建Os线程
IThread *CreateThread(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/const char *name, /*[in ]*/ThreadType type);
///////////////////////////////////////////////////////////////////////////////
typedef enum tag_ThreadpoolType
{
PT_AutoxThreadpool = 0, //自动调整线程池
PT_FixedThreadpool, //固定大小线程池
PT_SocksThreadpool, //socket 线程池
PT_EventThreadpool, //监控事件线程池
} ThreadpoolType;
//创建线程池
IThreadPool *CreateThreadPool(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/const char *name, /*[in ]*/uint32_t type);
IThreadPool *CreateThreadPool(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/const char *name, /*[in ]*/ThreadpoolType type);
///////////////////////////////////////////////////////////////////////////////
//获取frame 目录
......@@ -97,9 +119,9 @@ std::string GetFrameFolderDirectory(/*[in ]*/InstancesManager *lpInstancesManage
///////////////////////////////////////////////////////////////////////////////
//转换编码格式
uint32_t Convert( /*[in ]*/uint32_t nSrcCodepage, /*[in ]*/const char *src, /*[in ]*/uint32_t len, /*out*/std::wstring &dst ); // XXXXX->WCHAR
uint32_t Convert( /*[in ]*/const wchar_t *src, /*[in ]*/uint32_t len, /*[in ]*/uint32_t nDstCodepage, /*out*/std::string &dst ); // WCHAR->XXXXX
uint32_t Convert( /*[in ]*/uint32_t nSrcCodepage, /*[in ]*/const char *src, /*[in ]*/uint32_t len, /*[in ]*/uint32_t nDstCodepage, /*out*/std::string &dst ); //XXXXX->XXXXX
uint32_t Convert(/*[in ]*/uint32_t nSrcCodepage, /*[in ]*/const char *src, /*[in ]*/uint32_t len, /*out*/std::wstring &dst); // XXXXX->WCHAR
uint32_t Convert(/*[in ]*/const wchar_t *src, /*[in ]*/uint32_t len, /*[in ]*/uint32_t nDstCodepage, /*out*/std::string &dst); // WCHAR->XXXXX
uint32_t Convert(/*[in ]*/uint32_t nSrcCodepage, /*[in ]*/const char *src, /*[in ]*/uint32_t len, /*[in ]*/uint32_t nDstCodepage, /*out*/std::string &dst); //XXXXX->XXXXX
NAMESPACE_END(asynsdk)
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册