最近要实现一个批量请求不同网站的工具,本想用socket直接实现得了,但遇到https的站就傻了眼,因为要到其他一些机器上运行所以就不考虑用Python去实现了,找来找去还是决定用C++的OpenSSL库来实现它。
MySSL.h文件:
#include <openssl/ssl.h>
#include <algorithm> //transform
#include <string>
using namespace std;
#pragma comment(lib, "libeay32.lib")
#pragma comment(lib, "ssleay32.lib")
#define MAXHEADERSIZE MAX_PATH*10
#define MUTEX_TYPE HANDLE
typedef unsigned long (*ID_FUNC)(void);
typedef void (*LOCK_FUNC)(int,int,const char*,int);
class CMySSL
{
public:
//static void SetFakeRange(string fakeRange);
BOOL IsSSL();
int GetConnectPort();
string GetConnectIP();
void CancelTest();
static int THREAD_cleanup(MUTEX_TYPE *hMutexBuf);
static MUTEX_TYPE* THREAD_setup(ID_FUNC id_func,LOCK_FUNC lock_func);
static BOOL CompareNoCase(const string &strA,const string &strB);
void CloseConnect();
string FormatRequestHeaders(string szHost,string szObject,string szDataBuf="",string szCookies="",string szReferer="",
string szConnection="Close",string szCharset="",long nFrom=0,long nTo=0);
BOOL SetIpAndPort(string strIP,int nPort);
string GetLastError();
string GetAllHeaders();
string GetCookiesValue(string FieldName);
BOOL SetCookies(string CookiesBuf);
string GetCookies();
string GetHeaderField(string FieldName);
BOOL SetHeaderField(string FieldName,string FieldValue);
int GetResponseCode();
DWORD GetSize();
int GetResponse(char *buf,int nSize);
string GetResponse(DWORD dwSize=0);
BOOL SendRequest(int dwTimeout=10);
BOOL InitSSL(string TargetUrl,string data="",int Type=0);
CMySSL();
virtual ~CMySSL();
protected:
//string m_szFakeIP;
DWORD GetRandNumber(DWORD dwMin=2,DWORD dwMax=250);
//BOOL doFake(string szIpRange=""); //这个相关功能代码就不贴了
int m_RetryCount;
virtual int doConnect(string szHost,int nPort,int nTimeout);
virtual int RecvData(void *Buf,size_t len,int nTimeout=15);
virtual int SendData(void *Buf,size_t len,int nTimeout=15);
BOOL m_bSSL;
BOOL m_bRecvHeader;
BOOL m_bConnected;
DWORD m_HtmlLength;
string ResolveHost(string szHost);
string m_Path;
BOOL SplitHostAndPath(string strUrl);
SSL *m_sslObj;
SSL_CTX *m_ctxObj;
int m_Sockfd;
string m_Host;
int m_Port;
string m_IP;
string m_LastErrorStr;
string RecvAllHeaders();
string m_Cookies;
string m_RecvHeaderBuf;
string m_SendHeaderBuf;
DWORD m_ResponseSize;
};
#include "stdafx.h"
#include "MySSL.h"
#define NOCONNECTION "Connection is not established."
//static string m_FakeRange = "";
//static BOOL m_bFake = FALSE;
CMySSL::CMySSL()
{
//ERR_load_BIO_strings();
//SSL_load_error_strings();
//SSLeay_add_ssl_algorithms();
m_sslObj = NULL;
m_ctxObj = NULL;
m_Sockfd = INVALID_SOCKET;
m_bConnected = FALSE;
m_bRecvHeader = FALSE;
m_bSSL = FALSE;
m_Cookies = "";
m_RetryCount = 2;
}
CMySSL::~CMySSL()
{
CloseConnect();
}
BOOL CMySSL::InitSSL(string TargetUrl,string data,int Type) //Can use http
{
/***********Init*****************/
m_sslObj = NULL;
m_ctxObj = NULL;
m_Sockfd = INVALID_SOCKET;
CloseConnect();
m_bConnected = FALSE;
m_bRecvHeader = FALSE;
m_bSSL = FALSE;
m_Cookies = "";
m_RetryCount = 2;
/***********************************/
if(CompareNoCase(TargetUrl.substr(0,6),"https:"))
m_bSSL = TRUE;
if(!SplitHostAndPath(TargetUrl)){
m_LastErrorStr = "Url is error.";
return FALSE;
}
m_IP=ResolveHost(m_Host);
if(m_IP.compare("127.0.0.1")==0){
m_LastErrorStr = "Resolve host to ip failed.";
return FALSE;
}
m_SendHeaderBuf=Fo