diff options
Diffstat (limited to 'plugins/CurrencyRates/src/HTTPSession.cpp')
-rw-r--r-- | plugins/CurrencyRates/src/HTTPSession.cpp | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/plugins/CurrencyRates/src/HTTPSession.cpp b/plugins/CurrencyRates/src/HTTPSession.cpp new file mode 100644 index 0000000000..20f3498e8a --- /dev/null +++ b/plugins/CurrencyRates/src/HTTPSession.cpp @@ -0,0 +1,150 @@ +#include "StdAfx.h" + +class CHTTPSession::CImpl +{ +public: + CImpl() {} + virtual ~CImpl() {} + + virtual bool OpenURL(const tstring& rsURL) = 0; + virtual bool ReadResponce(tstring& rsResponce)const = 0; +}; + +int find_header(const NETLIBHTTPREQUEST* pRequest, const char* hdr) +{ + for (int i = 0; i < pRequest->headersCount; ++i) + { + if (0 == _stricmp(pRequest->headers[i].szName, hdr)) + { + return i; + } + } + + return -1; +} + +class CImplMI : public CHTTPSession::CImpl +{ +public: + CImplMI() {} + + static bool Init() + { + assert(nullptr == g_hNetLib); + + NETLIBUSER nlu = {}; + nlu.flags = NUF_OUTGOING | NUF_HTTPCONNS | NUF_NOHTTPSOPTION | NUF_UNICODE; + nlu.szSettingsModule = QUOTES_PROTOCOL_NAME; + nlu.szDescriptiveName.w = TranslateT("Quotes HTTP connections"); + g_hNetLib = Netlib_RegisterUser(&nlu); + return (nullptr != g_hNetLib); + } + + static bool IsValid() { return nullptr != g_hNetLib; } + + virtual bool OpenURL(const tstring& rsURL) + { + m_aURL.clear(); + + std::string s = quotes_t2a(rsURL.c_str()); + const char* psz = s.c_str(); + m_aURL.insert(m_aURL.begin(), psz, psz + mir_strlen(psz) + 1); + return true; + } + + virtual bool ReadResponce(tstring& rsResponce)const + { + if (true == m_aURL.empty()) + return false; + + NETLIBHTTPREQUEST nlhr = { 0 }; + nlhr.cbSize = sizeof(nlhr); + nlhr.requestType = REQUEST_GET; + nlhr.flags = NLHRF_DUMPASTEXT | NLHRF_HTTP11 | NLHRF_REDIRECT; + char* pURL = &*(m_aURL.begin()); + nlhr.szUrl = pURL; + + nlhr.headersCount = 4; + nlhr.headers = (NETLIBHTTPHEADER*)mir_alloc(sizeof(NETLIBHTTPHEADER)*nlhr.headersCount); + nlhr.headers[0].szName = "User-Agent"; + nlhr.headers[0].szValue = NETLIB_USER_AGENT; + nlhr.headers[1].szName = "Connection"; + nlhr.headers[1].szValue = "close"; + nlhr.headers[2].szName = "Cache-Control"; + nlhr.headers[2].szValue = "no-cache"; + nlhr.headers[3].szName = "Pragma"; + nlhr.headers[3].szValue = "no-cache"; + // nlhr.headers[4].szName = "Accept-Encoding"; + // nlhr.headers[4].szValue = "deflate, gzip"; + // nlhr.headers[5].szName = "Cookie"; + // nlhr.headers[5].szValue = cookie; + + bool bResult = false; + NETLIBHTTPREQUEST* pReply = nullptr; + { + mir_cslock lck(m_mx); + pReply = Netlib_HttpTransaction(g_hNetLib, &nlhr); + } + + if (pReply) { + if ((200 == pReply->resultCode) && (pReply->dataLength > 0)) { + TBuffer apBuffer; + apBuffer.insert(apBuffer.begin(), pReply->pData, pReply->pData + pReply->dataLength); + apBuffer.push_back('\0'); + + char* pResult = &*(apBuffer.begin()); + int nIndex = find_header(pReply, "Content-Type"); + if ((-1 != nIndex) && (nullptr != strstr(_strlwr(pReply->headers[nIndex].szValue), "utf-8"))) { + wchar_t* p = mir_utf8decodeW(pResult); + rsResponce = p; + mir_free(p); + } + else { + // USES_CONVERSION; + // LPCTSTR p = A2CT(pResult); + rsResponce = quotes_a2t(pResult);//p; + } + + bResult = true; + } + + Netlib_FreeHttpRequest(pReply); + } + + mir_free(nlhr.headers); + + return bResult; + } + +private: + static HNETLIBUSER g_hNetLib; + typedef std::vector<char> TBuffer; + mutable TBuffer m_aURL; + mutable mir_cs m_mx; +}; + +HNETLIBUSER CImplMI::g_hNetLib = nullptr; + +CHTTPSession::CHTTPSession() + : m_pImpl(new CImplMI) +{ +} + +CHTTPSession::~CHTTPSession() +{ +} + +bool CHTTPSession::OpenURL(const tstring& rsURL) +{ + return m_pImpl->OpenURL(rsURL); +} + +bool CHTTPSession::ReadResponce(tstring& rsResponce)const +{ + return m_pImpl->ReadResponce(rsResponce); +} + +bool CHTTPSession::Init() +{ + return CImplMI::Init(); +}
\ No newline at end of file |