HttpAgent.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. /*
  2. * Copyright: JessMA Open Source (ldcsaa@gmail.com)
  3. *
  4. * Version : 3.6.1
  5. * Author : Bruce Liang
  6. * Website : http://www.jessma.org
  7. * Project : https://github.com/ldcsaa
  8. * Blog : http://www.cnblogs.com/ldcsaa
  9. * Wiki : http://www.oschina.net/p/hp-socket
  10. * QQ Group : 75375912
  11. *
  12. * Licensed under the Apache License, Version 2.0 (the "License");
  13. * you may not use this file except in compliance with the License.
  14. * You may obtain a copy of the License at
  15. *
  16. * http://www.apache.org/licenses/LICENSE-2.0
  17. *
  18. * Unless required by applicable law or agreed to in writing, software
  19. * distributed under the License is distributed on an "AS IS" BASIS,
  20. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  21. * See the License for the specific language governing permissions and
  22. * limitations under the License.
  23. */
  24. #include "stdafx.h"
  25. #include "HttpAgent.h"
  26. template<class T> BOOL CHttpAgentT<T>::CheckParams()
  27. {
  28. if (m_enLocalVersion != HV_1_1 && m_enLocalVersion != HV_1_0)
  29. {
  30. SetLastError(SE_INVALID_PARAM, __FUNCTION__, ERROR_INVALID_PARAMETER);
  31. return FALSE;
  32. }
  33. return __super::CheckParams();
  34. }
  35. template<class T> BOOL CHttpAgentT<T>::SendRequest(CONNID dwConnID, LPCSTR lpszMethod, LPCSTR lpszPath, const THeader lpHeaders[], int iHeaderCount, const BYTE* pBody, int iLength)
  36. {
  37. THttpObj* pHttpObj = FindHttpObj(dwConnID);
  38. ASSERT(pHttpObj != nullptr);
  39. if(pHttpObj == nullptr)
  40. {
  41. ::SetLastError(ERROR_INVALID_STATE);
  42. return FALSE;
  43. }
  44. WSABUF szBuffer[2];
  45. CStringA strHeader;
  46. ::MakeRequestLine(lpszMethod, lpszPath, m_enLocalVersion, strHeader);
  47. ::MakeHeaderLines(lpHeaders, iHeaderCount, &pHttpObj->GetCookieMap(), iLength, TRUE, strHeader);
  48. ::MakeHttpPacket(strHeader, pBody, iLength, szBuffer);
  49. return SendPackets(dwConnID, szBuffer, 2);
  50. }
  51. template<class T> EnHandleResult CHttpAgentT<T>::DoFireConnect(TSocketObj* pSocketObj)
  52. {
  53. EnHandleResult result = __super::DoFireConnect(pSocketObj);
  54. if(result != HR_ERROR)
  55. VERIFY(SetConnectionReserved(pSocketObj, THttpObj::Construct(FALSE, this, pSocketObj)));
  56. return result;
  57. }
  58. template<class T> EnHandleResult CHttpAgentT<T>::DoFireReceive(TSocketObj* pSocketObj, const BYTE* pData, int iLength)
  59. {
  60. THttpObj* pHttpObj = FindHttpObj(pSocketObj);
  61. ASSERT(pHttpObj);
  62. return pHttpObj->Execute(pData, iLength);
  63. }
  64. template<class T> EnHandleResult CHttpAgentT<T>::DoFireClose(TSocketObj* pSocketObj, EnSocketOperation enOperation, int iErrorCode)
  65. {
  66. EnHandleResult result = __super::DoFireClose(pSocketObj, enOperation, iErrorCode);
  67. THttpObj* pHttpObj = FindHttpObj(pSocketObj);
  68. if(pHttpObj != nullptr)
  69. THttpObj::Destruct(pHttpObj);
  70. return result;
  71. }
  72. template<class T> EnHandleResult CHttpAgentT<T>::DoFireShutdown()
  73. {
  74. EnHandleResult result = __super::DoFireShutdown();
  75. return result;
  76. }
  77. template<class T> BOOL CHttpAgentT<T>::IsUpgrade(CONNID dwConnID)
  78. {
  79. THttpObj* pHttpObj = FindHttpObj(dwConnID);
  80. if(pHttpObj == nullptr)
  81. return FALSE;
  82. return pHttpObj->IsUpgrade();
  83. }
  84. template<class T> BOOL CHttpAgentT<T>::IsKeepAlive(CONNID dwConnID)
  85. {
  86. THttpObj* pHttpObj = FindHttpObj(dwConnID);
  87. if(pHttpObj == nullptr)
  88. return FALSE;
  89. return pHttpObj->IsKeepAlive();
  90. }
  91. template<class T> USHORT CHttpAgentT<T>::GetVersion(CONNID dwConnID)
  92. {
  93. THttpObj* pHttpObj = FindHttpObj(dwConnID);
  94. if(pHttpObj == nullptr)
  95. return 0;
  96. return pHttpObj->GetVersion();
  97. }
  98. template<class T> ULONGLONG CHttpAgentT<T>::GetContentLength(CONNID dwConnID)
  99. {
  100. THttpObj* pHttpObj = FindHttpObj(dwConnID);
  101. if(pHttpObj == nullptr)
  102. return 0;
  103. return pHttpObj->GetContentLength();
  104. }
  105. template<class T> LPCSTR CHttpAgentT<T>::GetContentType(CONNID dwConnID)
  106. {
  107. THttpObj* pHttpObj = FindHttpObj(dwConnID);
  108. if(pHttpObj == nullptr)
  109. return 0;
  110. return pHttpObj->GetContentType();
  111. }
  112. template<class T> EnHttpUpgradeType CHttpAgentT<T>::GetUpgradeType(CONNID dwConnID)
  113. {
  114. THttpObj* pHttpObj = FindHttpObj(dwConnID);
  115. if(pHttpObj == nullptr)
  116. return HUT_NONE;
  117. return pHttpObj->GetUpgradeType();
  118. }
  119. template<class T> USHORT CHttpAgentT<T>::GetParseErrorCode(CONNID dwConnID, LPCSTR* lpszErrorDesc)
  120. {
  121. THttpObj* pHttpObj = FindHttpObj(dwConnID);
  122. if(pHttpObj == nullptr)
  123. return 0;
  124. return pHttpObj->GetParseErrorCode(lpszErrorDesc);
  125. }
  126. template<class T> BOOL CHttpAgentT<T>::GetHeader(CONNID dwConnID, LPCSTR lpszName, LPCSTR* lpszValue)
  127. {
  128. THttpObj* pHttpObj = FindHttpObj(dwConnID);
  129. if(pHttpObj == nullptr)
  130. return 0;
  131. return pHttpObj->GetHeader(lpszName, lpszValue);
  132. }
  133. template<class T> BOOL CHttpAgentT<T>::GetHeaders(CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue[], DWORD& dwCount)
  134. {
  135. THttpObj* pHttpObj = FindHttpObj(dwConnID);
  136. if(pHttpObj == nullptr)
  137. return 0;
  138. return pHttpObj->GetHeaders(lpszName, lpszValue, dwCount);
  139. }
  140. template<class T> BOOL CHttpAgentT<T>::GetAllHeaders(CONNID dwConnID, THeader lpHeaders[], DWORD& dwCount)
  141. {
  142. THttpObj* pHttpObj = FindHttpObj(dwConnID);
  143. if(pHttpObj == nullptr)
  144. return 0;
  145. return pHttpObj->GetAllHeaders(lpHeaders, dwCount);
  146. }
  147. template<class T> BOOL CHttpAgentT<T>::GetAllHeaderNames(CONNID dwConnID, LPCSTR lpszName[], DWORD& dwCount)
  148. {
  149. THttpObj* pHttpObj = FindHttpObj(dwConnID);
  150. if(pHttpObj == nullptr)
  151. return 0;
  152. return pHttpObj->GetAllHeaderNames(lpszName, dwCount);
  153. }
  154. template<class T> BOOL CHttpAgentT<T>::GetCookie(CONNID dwConnID, LPCSTR lpszName, LPCSTR* lpszValue)
  155. {
  156. THttpObj* pHttpObj = FindHttpObj(dwConnID);
  157. if(pHttpObj == nullptr)
  158. return FALSE;
  159. return pHttpObj->GetCookie(lpszName, lpszValue);
  160. }
  161. template<class T> BOOL CHttpAgentT<T>::GetAllCookies(CONNID dwConnID, TCookie lpCookies[], DWORD& dwCount)
  162. {
  163. THttpObj* pHttpObj = FindHttpObj(dwConnID);
  164. if(pHttpObj == nullptr)
  165. return FALSE;
  166. return pHttpObj->GetAllCookies(lpCookies, dwCount);
  167. }
  168. template<class T> BOOL CHttpAgentT<T>::AddCookie(CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue, BOOL bRelpace)
  169. {
  170. THttpObj* pHttpObj = FindHttpObj(dwConnID);
  171. if(pHttpObj == nullptr)
  172. return FALSE;
  173. return pHttpObj->AddCookie(lpszName, lpszValue, bRelpace);
  174. }
  175. template<class T> BOOL CHttpAgentT<T>::DeleteCookie(CONNID dwConnID, LPCSTR lpszName)
  176. {
  177. THttpObj* pHttpObj = FindHttpObj(dwConnID);
  178. if(pHttpObj == nullptr)
  179. return FALSE;
  180. return pHttpObj->DeleteCookie(lpszName);
  181. }
  182. template<class T> BOOL CHttpAgentT<T>::DeleteAllCookies(CONNID dwConnID)
  183. {
  184. THttpObj* pHttpObj = FindHttpObj(dwConnID);
  185. if(pHttpObj == nullptr)
  186. return FALSE;
  187. pHttpObj->DeleteAllCookies();
  188. return TRUE;
  189. }
  190. template<class T> USHORT CHttpAgentT<T>::GetStatusCode(CONNID dwConnID)
  191. {
  192. THttpObj* pHttpObj = FindHttpObj(dwConnID);
  193. if(pHttpObj == nullptr)
  194. return 0;
  195. return pHttpObj->GetStatusCode();
  196. }
  197. template<class T> inline typename CHttpAgentT<T>::THttpObj* CHttpAgentT<T>::FindHttpObj(CONNID dwConnID)
  198. {
  199. THttpObj* pHttpObj = nullptr;
  200. GetConnectionReserved(dwConnID, (PVOID*)&pHttpObj);
  201. return pHttpObj;
  202. }
  203. template<class T> inline typename CHttpAgentT<T>::THttpObj* CHttpAgentT<T>::FindHttpObj(TSocketObj* pSocketObj)
  204. {
  205. THttpObj* pHttpObj = nullptr;
  206. GetConnectionReserved(pSocketObj, (PVOID*)&pHttpObj);
  207. return pHttpObj;
  208. }
  209. template class CHttpAgentT<CTcpAgent>;
  210. #ifdef _SSL_SUPPORT
  211. #include "SSLAgent.h"
  212. template class CHttpAgentT<CSSLAgent>;
  213. #endif