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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? httpdownload.cpp

?? 類似于flashget的下載軟件
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
////////////////////////////////////////////////////////////////////////////////
//	Copyright (C) 2000-2001 Softelf Inc. All rights reserved.
////////////////////////////////////////////////////////////////////////////////
//
//	Author	: Telan 
//	Date	: 2000-10-04
//	Purpose	: Try to implement a Http Download Class that Support
//			  Resume Download,WWW Authorization,Proxy And Proxy
//			  Authorization,Redirect Support,Timeout Config,Retry
//			  Config,Notify Support,Job management.
//	TODO	: Job Management,Multi-Thread,Cookie Support
//	History	: 
//		1.0	: 2000-09-25 - Resume Download,Redirect Support,Proxy Support		
//		1.1	: 2000-09-26 - Timeout Config,Retry Config,Notify Support
//		1.2	: 2000-09-27 - WWW Authorization,Proxy Authorization
//		2.0 : 2000-10-04 - Change form using direct winsock to TE_Socket Functions
//						 - Add Socks-Proxy Support( socks4,socks4a,socks5 )
//						 - More Robust,More Extensible,More Wieldy 
//	Mailto	: telan@263.net ( Bugs' Report or Comments )
//	Notes	: This source code may be used in any form in any way you desire. It is
//			  provided "as is" without express or implied warranty.Use it at your own
//			  risk! The author accepts no liability for any damage/loss of business 
//			  that this product may cause.
//
////////////////////////////////////////////////////////////////////////////////
// HttpDownload.cpp: implementation of the CHttpDownload class.

#include "stdafx.h"
#include "TE_Socket.h"
#include "SocksPacket.h"	// Socks Proxy Support
#include "HttpDownload.h"

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

//緩沖大小 10K
#define READ_BUFFER_SIZE (10*1024)

// 用于BASE64編碼、解碼的常量
CString CHttpDownload::m_strBase64TAB = _T( "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" );
UINT	CHttpDownload::m_nBase64Mask[]= { 0, 1, 3, 7, 15, 31, 63, 127, 255 };

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CHttpDownload::CHttpDownload()
{
	m_strDownloadUrl	= _T("");
	m_strSavePath		= _T("");
	m_strTempSavePath	= _T("");

	// 停止下載
	m_bStopDownload		= FALSE;

	// 強制重新下載(不管已有的文件是否與遠程文件相同)
	m_bForceDownload	= FALSE;

	// 是否支持斷點續傳(假定不支持)
	m_bSupportResume	= FALSE;

	// 文件以及下載大小
	m_dwFileSize			= 0;	// 文件總的大小	
	m_dwFileDownloadedSize	= 0;	// 文件總共已經下載的大小

	m_dwDownloadSize	= 0;		// 本次Request需要下載的大小
	m_dwDownloadedSize	= 0;		// 本次Request已經下載的大小

	m_dwHeaderSize		= 0;		// HTTP協議頭的長度
	m_strHeader			= _T("");	// HTTP協議頭

	// Referer
	m_strReferer		= _T("");
	
	// UserAgent
	m_strUserAgent		= _T("HttpDownload/2.0");

	// 超時TIMEOUT	連接超時、發送超時、接收超時(單位:毫秒)
	m_dwConnectTimeout	= DOWNLOAD_CONNECT_TIMEOUT;	
	m_dwReceiveTimeout	= DOWNLOAD_RECV_TIMEOUT;
	m_dwSendTimeout		= DOWNLOAD_SEND_TIMEOUT;

	// 重試機制
	m_nRetryType		= RETRY_TYPE_NONE;	//重試類型(0:不重試 1:重試一定次數 2:總是重試)
	m_nRetryTimes		= 0;				//重試次數
	m_nRetryDelay		= 0;				//重試延遲(單位:毫秒)
	m_nRetryMax			= 0;				//重試最大次數

	// 錯誤處理
	m_nErrorCount		= 0;			//錯誤次數
	m_strError			= _T("");		//錯誤信息

	// 向其他窗口發送消息
	m_bNotify			= FALSE;			// 是否向外發送通知消息	
	m_hNotifyWnd		= NULL;		// 被通知的窗口
	m_nNotifyMessage	= 0;	// 被通知的消息

	// 是否進行驗證 : Request-Header: Authorization
	m_bAuthorization	= FALSE;
	m_strUsername		= _T("");
	m_strPassword		= _T("");

	// 是否使用代理 
	m_bProxy			= FALSE;
	m_strProxyServer	= _T("");
	m_nProxyPort		= 0;
	m_nProxyType		= PROXY_NONE;
	
	// 代理是否需要驗證: Request-Header: Proxy-Authorization
	m_bProxyAuthorization = FALSE;
	m_strProxyUsername 	= _T("");
	m_strProxyPassword	= _T("");

	// 下載過程中所用的變量
	m_strServer			= _T("");
	m_strObject			= _T("");
	m_strFileName		= _T("");
	m_nPort				= DEFAULT_HTTP_PORT ;
	
	// SOCKET 和 BufSocket
	m_hSocket			= INVALID_SOCKET;
	m_pBSD				= NULL;
}

// 析構函數
CHttpDownload::~CHttpDownload()
{
	CloseSocket();
}


// 創建SOCKET
BOOL CHttpDownload::CreateSocket()
{
	CloseSocket();

	m_hSocket = TE_CreateSocket(AF_INET,SOCK_STREAM,0);
	if (m_hSocket == INVALID_SOCKET)
		return FALSE;
	
	m_pBSD = TE_BSocketAttach(m_hSocket,READ_BUFFER_SIZE);
	if( m_pBSD == NULL )
		return FALSE;

	return TRUE;
}

// 關閉SOCKET
void CHttpDownload::CloseSocket()
{
	if( m_pBSD != NULL )
	{
		TE_BSocketDetach(m_pBSD,FALSE);
		m_pBSD = NULL;
	}
	
	if (m_hSocket != INVALID_SOCKET)
	{
		TE_CloseSocket(m_hSocket,TRUE);
		m_hSocket = INVALID_SOCKET;
	}
}


// 下載入口
UINT CHttpDownload::Download(LPCTSTR lpszDownloadUrl,LPCTSTR lpszSavePath,BOOL bForceDownload /*= FALSE */)
{
	m_bStopDownload	  = FALSE;
	m_bForceDownload  = bForceDownload;
	m_nRetryTimes	  = 0;
	
	// 檢驗要下載的URL是否為空
	m_strDownloadUrl = lpszDownloadUrl;
	m_strDownloadUrl.TrimLeft();
	m_strDownloadUrl.TrimRight();
	if( m_strDownloadUrl.IsEmpty() )
		return DOWNLOAD_RESULT_FAIL;

	// 檢驗要下載的URL是否有效
	if ( !ParseURL(m_strDownloadUrl, m_strServer, m_strObject, m_nPort))
	{
		// 在前面加上"http://"再試
		m_strDownloadUrl = _T("http://") + m_strDownloadUrl;
		if ( !ParseURL(m_strDownloadUrl,m_strServer, m_strObject, m_nPort) )
		{
			TRACE(_T("Failed to parse the URL: %s\n"), m_strDownloadUrl);
			return DOWNLOAD_RESULT_FAIL;
		}
	}

	// 檢查本地保存路徑
	m_strSavePath =  lpszSavePath;
	m_strSavePath.TrimLeft();
	m_strSavePath.TrimRight();
	if( m_strSavePath.IsEmpty() )
		return DOWNLOAD_RESULT_FAIL;
	m_strTempSavePath =  m_strSavePath;
	m_strTempSavePath += ".down";

	m_dwDownloadedSize		= 0;
	m_dwFileDownloadedSize	= 0;
	m_dwFileSize			= 0;
	m_dwDownloadSize		= 0;

	BOOL bSendOnce = TRUE;		// 用于控制向hWndNotify窗口發送消息
	
ReDownload:
	UINT nRequestRet = SendRequest( FALSE ) ;
	switch(nRequestRet)
	{
	case SENDREQUEST_SUCCESS:
		break;
	case SENDREQUEST_STOP:
		return DOWNLOAD_RESULT_STOP;
		break;
	case SENDREQUEST_FAIL:
		return DOWNLOAD_RESULT_FAIL;
		break;
	case SENDREQUEST_ERROR:
		// 是否應該停止下載
		if (m_bStopDownload)
			return DOWNLOAD_RESULT_STOP;

		switch( m_nRetryType )
		{
		case RETRY_TYPE_NONE:
			return DOWNLOAD_RESULT_FAIL;
			break;
		case RETRY_TYPE_ALWAYS:
			if( m_nRetryDelay > 0 )
				Sleep(m_nRetryDelay);
			goto ReDownload;
			break;
		case RETRY_TYPE_TIMES:
			if( m_nRetryTimes > m_nRetryMax )
				return DOWNLOAD_RESULT_FAIL;
			m_nRetryTimes++;
		
			if( m_nRetryDelay > 0 )
				Sleep( m_nRetryDelay );
			goto ReDownload;
			break;
		default:
			return DOWNLOAD_RESULT_FAIL;
			break;
		}
		break;
	default:
		return DOWNLOAD_RESULT_FAIL;
		break;
	}

	if (m_dwDownloadSize == 0 /*|| m_dwHeaderSize == 0*/)
		return DOWNLOAD_RESULT_FAIL;

	if( !m_bForceDownload ) // 非強制下載,不檢查Last-Modified
	{
		CFileStatus fileStatus;
		if (CFile::GetStatus(m_strSavePath,fileStatus))
		{
			// 可能會存在1秒的誤差
			if (( fileStatus.m_mtime - m_TimeLastModified <=2 && m_TimeLastModified-fileStatus.m_mtime<=2 ) && (DWORD)fileStatus.m_size == m_dwFileSize )
				return DOWNLOAD_RESULT_SAMEAS;
		}
	}
	CFile fileDown;
	if(! fileDown.Open(m_strTempSavePath,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite|CFile::shareDenyWrite) )
		return DOWNLOAD_RESULT_FAIL;	

	// 應該判斷一下是否支持斷點續傳
	if( m_bSupportResume )
	{
		try
		{
			fileDown.SeekToEnd();
		}
		catch(CFileException* e)                                         
		{
		  e->Delete();
		  return DOWNLOAD_RESULT_FAIL;
		}	
	}
	
	// 獲取的文件名
	//m_strFileName = m_strSavePath.Right(m_strSavePath.GetLength()-m_strSavePath.ReverseFind('\\')-1);
	int nSlash = m_strObject.ReverseFind(_T('/'));
	if (nSlash == -1)
		nSlash = m_strObject.ReverseFind(_T('\\'));
	if (nSlash != -1 && m_strObject.GetLength() > 1)
		m_strFileName = m_strObject.Right(m_strObject.GetLength() - nSlash - 1);
	else
		m_strFileName = m_strObject;

	if( bSendOnce && m_bNotify )
	{
		DOWNLOADSTATUS DownloadStatus;
		
		DownloadStatus.dwFileSize  = m_dwFileSize;
		DownloadStatus.strFileName = m_strFileName;
		DownloadStatus.dwFileDownloadedSize  = m_dwFileDownloadedSize;

		DownloadStatus.nStatusType = STATUS_TYPE_FILESIZE;
		::SendMessage(m_hNotifyWnd,m_nNotifyMessage,MSG_DOWNLOAD_STATUS,(LPARAM)&DownloadStatus);	

		DownloadStatus.nStatusType = STATUS_TYPE_FILENAME;
		::SendMessage(m_hNotifyWnd,m_nNotifyMessage,MSG_DOWNLOAD_STATUS,(LPARAM)&DownloadStatus);	
	
		DownloadStatus.nStatusType = STATUS_TYPE_FILEDOWNLOADEDSIZE;
		::SendMessage(m_hNotifyWnd,m_nNotifyMessage,MSG_DOWNLOAD_STATUS,(LPARAM)&DownloadStatus);	
		
		bSendOnce = FALSE;
	}

	m_dwDownloadedSize = 0;
	// 現在開始讀取數據
	char szReadBuf[READ_BUFFER_SIZE+1];

	do
	{
		// 是否應該停止下載
		if (m_bStopDownload)
			return DOWNLOAD_RESULT_STOP;
		
		ZeroMemory(szReadBuf,READ_BUFFER_SIZE+1);
		int nRet = TE_BSocketGetData(m_pBSD,szReadBuf,READ_BUFFER_SIZE,m_dwReceiveTimeout);
		if (nRet <= 0)
		{
			fileDown.Close();
			m_nErrorCount++;
			goto ReDownload; //再次發送請求
		}

		// 將數據寫入文件
		try
		{
			fileDown.Write(szReadBuf,nRet);
		}
		catch(CFileException* e)
		{
			e->Delete();
			fileDown.Close();
			goto ReDownload;
		}

		m_dwDownloadedSize		+= nRet;
		m_dwFileDownloadedSize	+= nRet;

		// 通知消息
		if( m_bNotify )
		{
			DOWNLOADSTATUS DownloadStatus;
			DownloadStatus.nStatusType			= STATUS_TYPE_FILEDOWNLOADEDSIZE;
			DownloadStatus.dwFileDownloadedSize = m_dwFileDownloadedSize;
			DownloadStatus.dwFileSize			= m_dwFileSize;
			DownloadStatus.strFileName			= m_strFileName;
			::SendMessage(m_hNotifyWnd,m_nNotifyMessage,MSG_DOWNLOAD_STATUS,(LPARAM)&DownloadStatus);	
		}

	}while(m_dwDownloadedSize < m_dwDownloadSize);

	// 關閉文件
	fileDown.Close();
	
	//關閉SOCKET
	CloseSocket();

	// 文件改名
	//首先將已有的文件刪除
	try
	{
		CFile::Remove(m_strSavePath);
	}
	catch(CFileException *e)
	{
		e->Delete();
	}

	//再將新下載的文件改名
	try
	{
		CFile::Rename(m_strTempSavePath,m_strSavePath);
	}
	catch(CFileException *e)
	{
		e->Delete();
	}
	//再將新下載的文件的時間改回去
	CFileStatus fileStatus;
	CFile::GetStatus(m_strSavePath,fileStatus);
	fileStatus.m_mtime = m_TimeLastModified;
	CFile::SetStatus(m_strSavePath,fileStatus);
	
	// 不再進行其他操作
	//m_bStopDownload = TRUE;
	return DOWNLOAD_RESULT_SUCCESS;
}
	
// 發送請求
// 重定向的時候要加上Referer
UINT CHttpDownload::SendRequest(BOOL bHead /* = FALSE */)
{
	CString strVerb;
	if( bHead )

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美人与z0zoxxxx视频| 99久久er热在这里只有精品15| 亚洲免费高清视频在线| 国产欧美日韩亚州综合| 精品对白一区国产伦| 91精品国产高清一区二区三区蜜臀| 欧美在线999| 欧美日韩国产精选| 欧美日韩一区二区三区视频| 欧美电影免费观看高清完整版在线观看 | 2019国产精品| 久久欧美中文字幕| 国产亚洲精品精华液| 国产日韩精品久久久| 国产免费观看久久| 中文字幕亚洲电影| 中文字幕在线不卡| 亚洲综合色在线| 丝袜诱惑亚洲看片| 麻豆成人久久精品二区三区红 | 老司机一区二区| 精品一区二区国语对白| 黄色精品一二区| 国产成人精品免费看| 99免费精品在线| 欧美写真视频网站| 91精品欧美综合在线观看最新| 日韩欧美国产综合| 久久久久久久久久久黄色| 久久久久久亚洲综合影院红桃| 国产精品污污网站在线观看| 中文字幕在线一区免费| 99国产麻豆精品| 久久av老司机精品网站导航| 韩国av一区二区三区| 成人免费观看视频| 欧美在线观看18| 日韩欧美一级精品久久| 精品久久久久久久久久久久久久久久久 | 日本不卡一区二区三区高清视频| 极品尤物av久久免费看| av高清不卡在线| 欧美日韩在线一区二区| 欧美一区二区福利视频| 久久综合久久久久88| 视频一区欧美精品| 91九色02白丝porn| 91精品国产欧美一区二区成人 | 国产91精品一区二区麻豆网站| 免费在线看成人av| 成人在线视频一区二区| 欧美久久一区二区| 丁香网亚洲国际| 精品影视av免费| 91小视频在线观看| 日韩一卡二卡三卡| 亚洲欧美一区二区不卡| 另类中文字幕网| av在线播放成人| 日韩亚洲欧美一区二区三区| 亚洲同性gay激情无套| 日本免费在线视频不卡一不卡二| 国产成人精品影视| 欧美精品高清视频| 国产精品国产三级国产专播品爱网 | 91国偷自产一区二区三区观看| 欧美电影免费观看完整版| 国产精品久久精品日日| 亚洲老妇xxxxxx| 国产一区二区电影| 在线观看日韩高清av| 国产三级精品在线| 亚洲一区二区精品3399| 成人美女视频在线看| 国产精品自拍一区| 欧美高清dvd| 精品动漫一区二区三区在线观看| 亚洲色图制服丝袜| 国产蜜臀av在线一区二区三区| 日韩综合一区二区| 成人午夜视频在线| 精品久久久久av影院| 日韩激情视频在线观看| av不卡在线播放| 久久精品亚洲麻豆av一区二区| 天堂av在线一区| 欧美亚州韩日在线看免费版国语版| 欧美成人乱码一区二区三区| 婷婷中文字幕综合| 色诱视频网站一区| 欧美激情中文不卡| 久久99国产精品久久99果冻传媒| 欧美性色综合网| 综合亚洲深深色噜噜狠狠网站| 美女视频一区在线观看| 成人三级在线视频| 欧美精品粉嫩高潮一区二区| 91免费版在线看| 久久综合国产精品| 亚洲v中文字幕| 国产米奇在线777精品观看| 日韩情涩欧美日韩视频| 亚洲国产中文字幕| 91蝌蚪porny| 欧美经典一区二区| 国产一区二区三区视频在线播放| 51精品国自产在线| 亚洲欧洲另类国产综合| 91在线无精精品入口| 久久久久久一级片| 另类小说视频一区二区| 欧美精品vⅰdeose4hd| 一区二区三区毛片| 色婷婷一区二区三区四区| 国产精品国产三级国产普通话蜜臀| 国产福利一区二区三区视频 | 精品国产污网站| 奇米一区二区三区| 欧美三级欧美一级| 亚洲高清久久久| 99久久国产综合精品女不卡| 欧美一区三区四区| 99久久综合精品| 中文字幕欧美激情| 国产精品一区不卡| 国产色综合久久| 国产一区二区三区在线观看免费 | 日本成人在线不卡视频| 欧美久久久久久久久中文字幕| 日日夜夜一区二区| 337p亚洲精品色噜噜| 精品一区二区三区在线观看国产| 日韩视频不卡中文| 国产成人av网站| 中文字幕国产一区二区| 欧美亚洲自拍偷拍| 日韩福利电影在线| 久久精品日韩一区二区三区| 成人做爰69片免费看网站| 亚洲美女视频在线| 欧美日韩情趣电影| 国产一区二区三区精品欧美日韩一区二区三区 | 日韩三级精品电影久久久 | 欧美亚洲综合一区| 九色|91porny| 中文一区二区在线观看| 在线看国产一区二区| 视频一区二区三区中文字幕| 久久精品一区二区三区四区| eeuss国产一区二区三区| 亚洲福利一二三区| 91精品国产色综合久久久蜜香臀| 国产成人免费视频网站 | 91.成人天堂一区| 国产乱国产乱300精品| 中文字幕视频一区二区三区久| 欧美色图天堂网| 日韩精品福利网| 中文字幕日韩欧美一区二区三区| 欧美日韩不卡视频| 国产麻豆精品视频| 亚洲国产精品一区二区久久恐怖片 | 91网站在线播放| 午夜精品福利在线| 国产精品色噜噜| 欧美乱妇一区二区三区不卡视频| 精品久久久久久久久久久久久久久 | 91丨porny丨在线| 91精品国产高清一区二区三区 | 国产在线精品一区二区三区不卡| 日韩福利电影在线| 9人人澡人人爽人人精品| 日韩视频一区二区三区在线播放| 日本成人超碰在线观看| 欧美日韩视频在线观看一区二区三区| 亚洲影视资源网| 91麻豆免费视频| 亚洲国产精品久久人人爱 | 欧美三级日韩三级| 天天色天天操综合| 欧美午夜宅男影院| 图片区小说区区亚洲影院| 99久久婷婷国产| 精品久久久久久久久久久久包黑料| 国产视频一区二区在线观看| 国产一区二区久久| 精品捆绑美女sm三区| 麻豆传媒一区二区三区| 日韩欧美国产系列| 免费看黄色91| 精品美女在线观看| 激情亚洲综合在线| 国产亚洲一区二区在线观看| 日本vs亚洲vs韩国一区三区二区| 91精品国产黑色紧身裤美女| 久久综合综合久久综合| 欧美精品一区男女天堂| 精品在线一区二区| 国产亚洲婷婷免费| 91在线免费看|