亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? downloadhttp.cpp

?? ◆◆◆ 《FTP、HTTP 多線程斷點(diǎn)續(xù)傳下載文件》◆◆◆ FlashGet、網(wǎng)絡(luò)螞蟻想必大家都很熟悉
?? CPP
字號:
// DownloadHttp.cpp: implementation of the CDownloadHttp class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "NetDownMTR.h"
#include "DownloadHttp.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

void DownloadNotify ( int nIndex, UINT nNotityType, LPVOID lpNotifyData, LPVOID pDownloadMTR );

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDownloadHttp::CDownloadHttp()
{

}

CDownloadHttp::~CDownloadHttp()
{

}

BOOL CDownloadHttp::DownloadOnce()
{
	// 不需要下載了
	int nWillDownloadSize = Get_WillDownloadSize();				// 本次應(yīng)該下載的字節(jié)數(shù)
	int nDownloadedSize = Get_DownloadedSize ();				// 已下載字節(jié)數(shù)
	if ( nWillDownloadSize > 0 && nDownloadedSize >= nWillDownloadSize )
		return DownloadEnd(TRUE);

	if ( !CDownloadPub::DownloadOnce () )
		return DownloadEnd(FALSE);

	char szTailData[NET_BUFFER_SIZE] = {0};
	int nTailSize = sizeof(szTailData);
	if ( !RequestHttpData ( TRUE, szTailData, &nTailSize ) )
		return DownloadEnd(FALSE);
	// 從HTTP服務(wù)器中讀取數(shù)據(jù),并保存到文件中
	return DownloadEnd ( RecvDataAndSaveToFile(m_SocketClient,szTailData, nTailSize) );

}

BOOL CDownloadHttp::RequestHttpData(BOOL bGet, char *szTailData/*=NULL*/, int *pnTailSize/*=NULL*/ )
{
	int nTailSizeTemp = 0;
	BOOL bRedirect = TRUE;
	while ( bRedirect )
	{
		CString csReq = GetRequestStr ( bGet );
		CString csResponse;
		nTailSizeTemp = pnTailSize?(*pnTailSize):0;
		if ( !SendRequest ( csReq, csResponse, szTailData, &nTailSizeTemp ) )
			return FALSE;
		if ( !ParseResponseString ( csResponse, bRedirect ) )
			return FALSE;
	}
	if ( pnTailSize )
		*pnTailSize = nTailSizeTemp;

	return TRUE;
}

//
// 獲取遠(yuǎn)程站點(diǎn)信息,如:是否支持?jǐn)帱c(diǎn)續(xù)傳、要下載的文件大小和創(chuàng)建時(shí)間等
//
BOOL CDownloadHttp::GetRemoteSiteInfo()
{
	if ( !CDownloadPub::GetRemoteSiteInfo() )
		return FALSE;

	if ( !RequestHttpData ( TRUE ) )
		return FALSE;

	m_SocketClient.Disconnect ();
	return TRUE;
}

CString CDownloadHttp::GetRequestStr(BOOL bGet)
{
	CString strVerb;
	if( bGet )
		strVerb = _T("GET ");
	else
		strVerb = _T("HEAD ");
	
	CString csReq, strAuth, strRange;
	csReq  = strVerb  + m_csObject + " HTTP/1.1\r\n";

	if ( !m_csUsername.IsEmpty () )
	{
		strAuth = _T("");
		Base64Encode ( m_csUsername + ":" + m_csPassword, strAuth );
		csReq += "Authorization: Basic " + strAuth + "\r\n";
	}
	
	csReq += "Host: " + m_csServer + "\r\n";
	csReq += "Accept: */*\r\n";
	csReq += "Pragma: no-cache\r\n"; 
	csReq += "Cache-Control: no-cache\r\n";
	csReq += "User-Agent: "+m_csUserAgent+"\r\n";
	if( !m_csReferer.IsEmpty() )
		csReq += "Referer: "+m_csReferer+"\r\n";
	csReq += "Connection: close\r\n";
	
	// 指定要下載的文件范圍
	CString csEndPos;
	int nWillDownloadStartPos = Get_WillDownloadStartPos ();	// 開始位置
	int nWillDownloadSize = Get_WillDownloadSize();				// 本次應(yīng)該下載的字節(jié)數(shù)
	int nDownloadedSize = Get_DownloadedSize ();				// 已下載字節(jié)數(shù)
	if ( nWillDownloadSize >= 0 )
		csEndPos.Format ( "%d", nWillDownloadStartPos+nWillDownloadSize-1 );
	ASSERT ( nWillDownloadSize < 0 || nDownloadedSize < nWillDownloadSize );
	strRange.Format ( _T("Range: bytes=%d-%s\r\n"), nWillDownloadStartPos+nDownloadedSize, csEndPos );

	csReq += strRange;
	csReq += "\r\n";
	
	return csReq;
}

//
// 向服務(wù)器提交請求,并得到返回字符串
//
BOOL CDownloadHttp::SendRequest(LPCTSTR lpszReq, CString &csResponse, char *szTailData/*=NULL*/, int *pnTailSize/*=NULL*/ )
{
	m_SocketClient.Disconnect ();
	if ( !Connect () ) return FALSE;
	if ( !m_SocketClient.SendString ( lpszReq ) )
	{
		return FALSE;
	}

	for ( int i=0; ; i++ )
	{
		char szRecvBuf[NET_BUFFER_SIZE] = {0};
		int nReadSize = m_SocketClient.Receive ( szRecvBuf, sizeof(szRecvBuf) );
		if ( nReadSize <= 0 )
		{
			Log ( L_WARNING, "Receive response data failed" );
			return FALSE;
		}
		csResponse += szRecvBuf;
		char *p = strstr ( szRecvBuf, "\r\n\r\n" );
		if ( p )
		{
			if ( szTailData && pnTailSize && *pnTailSize > 0 )
			{
				p += 4;
				int nOtioseSize = nReadSize - int( p - szRecvBuf );
				*pnTailSize = MIN ( nOtioseSize, *pnTailSize );
				memcpy ( szTailData, p, *pnTailSize );
			}
#ifdef _DEBUG
			int nPos = csResponse.Find ( "\r\n\r\n", 0 );
			CString csDump;
			if ( nPos >= 0 ) csDump = csResponse.Left ( nPos );
			else csDump = csResponse;
//			TRACE ( "\n收到回應(yīng) <<<---------------------\n\n%s\n", csDump );
#endif
			break;
		}
	}

	return TRUE;
}

DWORD CDownloadHttp::GetResponseCode(CString csLineText)
{
	csLineText.MakeLower ();
	ASSERT ( csLineText.Find ( "http/", 0 ) >= 0 );
	int nPos = csLineText.Find ( " ", 0 );
	if ( nPos < 0 ) return 0;
	CString csCode = csLineText.Mid ( nPos + 1 );
	csCode.TrimLeft(); csCode.TrimRight();
	nPos = csCode.Find ( " ", 0 );
	if ( nPos < 0 ) nPos = csCode.GetLength() - 1;
	csCode = csCode.Left ( nPos );

	return (DWORD)atoi(csCode);
}

BOOL CDownloadHttp::ParseResponseString ( CString csResponseString, OUT BOOL &bRedirect )
{
	bRedirect = FALSE;
	// 獲取返回代碼
	CString csOneLine = GetOneLine ( csResponseString );
	DWORD dwResponseCode = GetResponseCode ( csOneLine );
	if ( dwResponseCode < 1 )
	{
		Log ( L_WARNING, "Received error response code : %s", csOneLine );
		return FALSE;
	}
	
	int nPos = 0;
	// 請求文件被重定向
	if( dwResponseCode >= 300 && dwResponseCode < 400 )
	{
		bRedirect = TRUE;
		// 得到請求文件新的URL
		CString csRedirectFileName = FindAfterFlagString ( "location:", csResponseString );
		
		// 設(shè)置 Referer
		m_csReferer = m_csDownloadUrl;
		
		// 重定向到其他的服務(wù)器
		nPos = csRedirectFileName.Find("://");
		if ( nPos >= 0 )
		{
			m_csDownloadUrl = csRedirectFileName;
			// 檢驗(yàn)要下載的URL是否有效
			if ( !ParseURL ( m_csDownloadUrl, m_csServer, m_csObject, m_nPort, m_csProtocolType ) )
			{
				Log ( L_WARNING, "Redirect media path [%s] invalid", m_csDownloadUrl );
				return FALSE;
			}
			return TRUE;
		}
		
		// 重定向到本服務(wù)器的其他地方
		csRedirectFileName.Replace ( "\\", "/" );
		// 重定向于根目錄
		if( csRedirectFileName[0] == '/' )
		{
			m_csObject = csRedirectFileName;
			DownloadNotify ( -1, NOTIFY_TYPE_GOT_REMOTE_FILENAME, (LPVOID)(LPCTSTR)(GetDownloadObjectFileName()), m_pDownloadMTR );
			return TRUE;
		}
		
		// 定向于相對當(dāng)前目錄
		int nParentDirCount = 0;
		nPos = csRedirectFileName.Find ( "../" );
		while ( nPos >= 0 )
		{
			csRedirectFileName = csRedirectFileName.Mid(nPos+3);
			nParentDirCount++;
			nPos = csRedirectFileName.Find("../");
		}
		for (int i=0; i<=nParentDirCount; i++)
		{
			nPos = m_csDownloadUrl.ReverseFind('/');
			if (nPos != -1)
				m_csDownloadUrl = m_csDownloadUrl.Left(nPos);
		}
		if ( csRedirectFileName.Find ( "./", 0 ) == 0 )
			csRedirectFileName.Delete ( 0, 2 );
		m_csDownloadUrl = m_csDownloadUrl+"/"+csRedirectFileName;
		
		return ParseURL ( m_csDownloadUrl, m_csServer, m_csObject, m_nPort, m_csProtocolType );
	}
	// 請求被成功接收、理解和接受
	else if( dwResponseCode >= 200 && dwResponseCode < 300 )
	{
		if ( m_nIndex == -1 )	// 主線程才需要獲取文件大小的信息
		{
			// 獲取 Content-Length
			CString csDownFileLen = FindAfterFlagString ( "content-length:", csResponseString );
			m_nFileTotalSize = (int) _ttoi( (LPCTSTR)csDownFileLen );
			DownloadNotify ( -1, NOTIFY_TYPE_GOT_REMOTE_FILESIZE, (LPVOID)m_nFileTotalSize, m_pDownloadMTR );
			int nWillDownloadStartPos = Get_WillDownloadStartPos ();	// 開始位置
			int nWillDownloadSize = Get_WillDownloadSize();				// 本次應(yīng)該下載的字節(jié)數(shù)
			int nDownloadedSize = Get_DownloadedSize ();				// 已下載字節(jié)數(shù)
			if ( m_nFileTotalSize > 0 && nWillDownloadSize-nDownloadedSize > m_nFileTotalSize )
				Set_WillDownloadSize ( m_nFileTotalSize-nDownloadedSize );
		}
		
		// 獲取服務(wù)器文件的最后修改時(shí)間
		CString csModifiedTime = FindAfterFlagString ( "last-modified:", csResponseString );
		if ( !csModifiedTime.IsEmpty() )
		{
			m_TimeLastModified = ConvertHttpTimeString(csModifiedTime);
		}

		if ( dwResponseCode == 206 )	// 支持?jǐn)帱c(diǎn)續(xù)傳
		{
			m_bSupportResume = TRUE;
		}
		else							// 不支持?jǐn)帱c(diǎn)續(xù)傳
		{
			m_bSupportResume = FALSE;
		}
		return TRUE;
	}

//	Log ( L_WARNING, "Index.%d receive invalid code : %d", m_nIndex, dwResponseCode );
	return FALSE;
}

CString CDownloadHttp::FindAfterFlagString(LPCTSTR lpszFoundStr, CString csOrg)
{
	ASSERT ( lpszFoundStr && strlen(lpszFoundStr) > 0 );
	CString csReturing, csFoundStr = GET_SAFE_STRING(lpszFoundStr);
	csFoundStr.MakeLower ();
	CString csOrgLower = csOrg;
	csOrgLower.MakeLower ();
	int nPos = csOrgLower.Find ( csFoundStr );
	if ( nPos < 0 ) return "";
	csReturing = csOrg.Mid ( nPos + csFoundStr.GetLength() );
	nPos = csReturing.Find("\r\n");
	if ( nPos < 0 ) return "";
	csReturing = csReturing.Left(nPos);
	csReturing.TrimLeft();
	csReturing.TrimRight();

	return csReturing;
}

//
// 將 HTTP 服務(wù)器表示的時(shí)間轉(zhuǎn)換為 CTime 格式,如:Wed, 16 May 2007 14:29:53 GMT
//
CTime CDownloadHttp::ConvertHttpTimeString(CString csTimeGMT)
{
	CString csYear, csMonth, csDay, csTime;
	CTime tReturning = -1;
	int nPos = csTimeGMT.Find ( ",", 0 );
	if ( nPos < 0 || nPos >= csTimeGMT.GetLength()-1 )
		return tReturning;
	csTimeGMT = csTimeGMT.Mid ( nPos + 1 );
	csTimeGMT.TrimLeft(); csTimeGMT.TrimRight ();

	// 日
	nPos = csTimeGMT.Find ( " ", 0 );
	if ( nPos < 0 || nPos >= csTimeGMT.GetLength()-1 )
		return tReturning;
	csDay = csTimeGMT.Left ( nPos );
	csTimeGMT = csTimeGMT.Mid ( nPos + 1 );
	csTimeGMT.TrimLeft(); csTimeGMT.TrimRight ();

	// 月
	nPos = csTimeGMT.Find ( " ", 0 );
	if ( nPos < 0 || nPos >= csTimeGMT.GetLength()-1 )
		return tReturning;
	csMonth = csTimeGMT.Left ( nPos );
	int nMonth = GetMouthByShortStr ( csMonth );
	ASSERT ( nMonth >= 1 && nMonth <= 12 );
	csMonth.Format ( "%02d", nMonth );
	csTimeGMT = csTimeGMT.Mid ( nPos + 1 );
	csTimeGMT.TrimLeft(); csTimeGMT.TrimRight ();

	// 年
	nPos = csTimeGMT.Find ( " ", 0 );
	if ( nPos < 0 || nPos >= csTimeGMT.GetLength()-1 )
		return tReturning;
	csYear = csTimeGMT.Left ( nPos );
	csTimeGMT = csTimeGMT.Mid ( nPos + 1 );
	csTimeGMT.TrimLeft(); csTimeGMT.TrimRight ();

	// 時(shí)間
	nPos = csTimeGMT.Find ( " ", 0 );
	if ( nPos < 0 || nPos >= csTimeGMT.GetLength()-1 )
		return tReturning;
	csTime = csTimeGMT.Left ( nPos );
	csTimeGMT = csTimeGMT.Mid ( nPos + 1 );

	CString csFileTimeInfo;
	csFileTimeInfo.Format ( "%s-%s-%s %s", csYear, csMonth, csDay, csTime );
	ConvertStrToCTime ( csFileTimeInfo.GetBuffer(0), tReturning );
	return tReturning;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人午夜视频在线观看| 亚洲午夜精品网| 国产伦精品一区二区三区免费迷| 欧美一区二区三区免费视频| 日韩经典中文字幕一区| 欧美一区永久视频免费观看| 九色porny丨国产精品| 欧美tickling网站挠脚心| 国内久久婷婷综合| 中文字幕一区二区三区乱码在线| 91美女片黄在线观看91美女| 亚洲欧美日韩在线| 欧美疯狂做受xxxx富婆| 精品一区二区三区的国产在线播放| www激情久久| 91浏览器入口在线观看| 偷拍日韩校园综合在线| 久久久美女毛片| 91免费小视频| 奇米色一区二区三区四区| 久久久精品影视| 色综合天天做天天爱| 92精品国产成人观看免费| 亚洲最新视频在线播放| 日韩欧美一区在线观看| 东方aⅴ免费观看久久av| 亚洲自拍偷拍综合| 日韩一区二区免费高清| 成人在线视频首页| 五月婷婷久久综合| 国产亚洲欧美色| 欧美三级日韩三级| 国产.欧美.日韩| 亚洲成人黄色影院| 国产精品美女久久久久久久| 欧美精品一二三区| 成人激情免费网站| 久久精品国产在热久久| 亚洲欧美区自拍先锋| 欧美精品一区二区久久久| 在线中文字幕一区二区| 国产精品综合久久| 亚洲18女电影在线观看| 中文av一区二区| 欧美va亚洲va香蕉在线| 欧美视频第二页| 成人av午夜电影| 国内久久婷婷综合| 午夜精品123| 亚洲免费三区一区二区| 日韩精品乱码免费| 亚洲欧洲精品一区二区三区不卡| 日韩欧美国产午夜精品| 精品污污网站免费看| 99热这里都是精品| 国产电影一区二区三区| 美女尤物国产一区| 免费欧美在线视频| 午夜欧美电影在线观看| 亚洲免费观看高清完整版在线| 亚洲国产精品99久久久久久久久 | www.日韩在线| 狠狠色狠狠色合久久伊人| 日韩不卡免费视频| 午夜私人影院久久久久| 一区二区三区不卡视频在线观看| 中文字幕亚洲不卡| 国产精品久久久久久久蜜臀| 国产三级精品三级| 国产肉丝袜一区二区| 久久九九全国免费| 久久九九久久九九| 国产日韩精品一区二区浪潮av| 精品电影一区二区三区| 久久综合色8888| 亚洲精品在线观| 久久青草欧美一区二区三区| 久久久天堂av| 国产精品日韩成人| 中文字幕制服丝袜一区二区三区| 欧美国产欧美综合| 成人免费在线视频| 一区二区视频在线| 亚洲午夜激情网页| 免费观看在线色综合| 九色porny丨国产精品| 国产综合一区二区| 国产精品18久久久久| 粉嫩久久99精品久久久久久夜| 风间由美一区二区av101| 成人精品小蝌蚪| 欧美精品一区二区三区久久久| 日韩一区二区在线播放| 精品理论电影在线观看| 久久色中文字幕| 国产精品久久久久久久第一福利 | 九九久久精品视频| 国产成人啪免费观看软件| 不卡的av中国片| 在线观看国产日韩| 欧美一卡二卡三卡四卡| 久久伊99综合婷婷久久伊| 中文字幕一区二区三区色视频| 亚洲另类中文字| 日韩成人一级片| 国产成人av电影在线播放| 色婷婷av一区二区三区之一色屋| 欧美日本韩国一区二区三区视频| 精品黑人一区二区三区久久| 日本一区二区三区久久久久久久久不 | 欧美色涩在线第一页| 日韩欧美中文字幕一区| 国产精品水嫩水嫩| 亚洲午夜视频在线| 国产伦精品一区二区三区视频青涩 | 国产亚洲一区二区三区四区| 亚洲男人天堂av网| 美女网站视频久久| 成人sese在线| 91精品久久久久久蜜臀| 色94色欧美sute亚洲线路二| 欧美精品一二三四| 国产精品婷婷午夜在线观看| 亚洲成va人在线观看| 国产麻豆9l精品三级站| 欧美日韩国产一区二区三区地区| 久久久99精品久久| 亚洲一区在线电影| 国产高清亚洲一区| 欧美剧在线免费观看网站| 欧美高清在线一区二区| 蜜臀av亚洲一区中文字幕| 99视频一区二区| 精品国产一区a| 日韩中文字幕不卡| 91论坛在线播放| 国产欧美在线观看一区| 男人的j进女人的j一区| 91国内精品野花午夜精品| 久久久不卡网国产精品二区| 婷婷开心激情综合| 91美女片黄在线| 中文字幕不卡在线观看| 精品一区二区精品| 欧美精品一二三区| 一区二区三区免费观看| 成人av高清在线| 久久久不卡网国产精品二区| 麻豆精品一区二区三区| 欧美日韩亚洲不卡| 一区二区三区在线观看视频| 成人99免费视频| 欧美激情一区二区三区四区 | 欧美精品一区在线观看| 视频一区欧美精品| 精品污污网站免费看| 亚洲综合成人在线视频| 色综合天天综合狠狠| 国产精品伦一区| 国产精品亚洲一区二区三区在线| 欧美成人精品高清在线播放| 日韩综合小视频| 欧美日韩高清一区| 视频一区二区欧美| 欧美日韩aaaaa| 日韩激情一二三区| 在线成人午夜影院| 青娱乐精品视频在线| 欧美精品一二三四| 男男gaygay亚洲| 亚洲精品在线网站| 国产九九视频一区二区三区| 国产日韩欧美电影| 成人免费看视频| 亚洲欧洲制服丝袜| 欧美三级资源在线| 性久久久久久久久| 日韩一级免费观看| 久久91精品国产91久久小草| 精品国产亚洲一区二区三区在线观看| 精品综合久久久久久8888| 精品国产sm最大网站免费看| 国产精品66部| 亚洲色图在线视频| 欧美日产国产精品| 精品夜夜嗨av一区二区三区| 久久久国产午夜精品| 成人理论电影网| 亚洲综合在线免费观看| 88在线观看91蜜桃国自产| 韩国av一区二区三区| 国产精品国产a| 欧美日韩色综合| 精品一区二区久久久| 中文字幕一区在线观看视频| 欧美色倩网站大全免费| 久久爱www久久做| 中文字幕一区二区三中文字幕| 欧美色手机在线观看| 国产一区二区不卡老阿姨|