httpmsg.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:10k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: httpmsg.cpp,v 1.10.32.1 2004/07/09 02:04:59 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. //#include "hlxclib/stdlib.h"
  50. //#include "hlxclib/stdio.h"
  51. #include "hxcom.h"
  52. #include "hxtypes.h"
  53. #include "hxstrutl.h"
  54. #include "hxstring.h"
  55. #include "hxslist.h"
  56. #include "mimehead.h"
  57. #include "ihxpckts.h"
  58. #include "hxauth.h"
  59. #include "httpmsg.h"
  60. #include "hxheap.h"
  61. #ifdef _DEBUG
  62. #undef HX_THIS_FILE
  63. static const char HX_THIS_FILE[] = __FILE__;
  64. #endif
  65. // static definitions
  66. const int HTTPMessage::MAJ_VERSION = 1;
  67. const int HTTPMessage::MIN_VERSION = 0;
  68. /*
  69.  * HTTPAuthentication methods
  70.  */
  71. HTTPAuthentication::HTTPAuthentication(const char* authString,
  72.     AuthenticationType authType):
  73.     m_authString(authString),
  74.     m_authValues(NULL),
  75.     m_authType(authType)
  76. {
  77. }
  78. HTTPAuthentication::HTTPAuthentication(IHXValues* pAuth):
  79.     m_authValues(pAuth),
  80.     m_authType(AU_DIGEST)
  81. {
  82.     if(m_authValues)
  83.         m_authValues->AddRef();
  84. }
  85. HTTPAuthentication::~HTTPAuthentication()
  86. {
  87.     if(m_authValues)
  88.         m_authValues->Release();
  89. }
  90. void
  91. HTTPAuthentication::asString(CHXString& str)
  92. {
  93.     if(m_authType == AU_HX_PRIVATE)
  94.     {
  95.         str = CHXString("HXPrivate nonce="") + m_authString + """;
  96.     }
  97.     else if(m_authType == AU_DIGEST)
  98.     {
  99.         UINT32 subAuthType;
  100.         if(HXR_OK != m_authValues->GetPropertyULONG32("AuthType", subAuthType))
  101.         {
  102.             str = "";
  103.             return;
  104.         }
  105.         switch(subAuthType)
  106.         {
  107.             case HX_AUTH_DIGEST:
  108.             {
  109.                 IHXBuffer* pRealm = 0;
  110.                 IHXBuffer* pNonce = 0;
  111.                 IHXBuffer* pOpaque= 0;
  112.                 if(HXR_OK == m_authValues->GetPropertyCString("Realm", pRealm) &&
  113.                    HXR_OK == m_authValues->GetPropertyCString("Nonce", pNonce) &&
  114.                    HXR_OK == m_authValues->GetPropertyCString("Opaque", pOpaque))
  115.                 {
  116.                     str = CHXString("Digest realm=") +
  117.                         pRealm->GetBuffer() + ",rn" +
  118.                         "    nonce=" + pNonce->GetBuffer() + ",rn" +
  119.                         "    opaque=" + pOpaque->GetBuffer();
  120.                 }
  121.                 if(pRealm) pRealm->Release();
  122.                 if(pNonce) pNonce->Release();
  123.                 if(pOpaque) pOpaque->Release();
  124.                 break;
  125.             }
  126.             case HX_AUTH_BASIC:
  127.             {
  128.                 IHXBuffer* pRealm = 0;
  129.                 IHXBuffer* pUserName = 0;
  130.                 IHXBuffer* pPassword = 0;
  131.                 IHXBuffer* pResponse = 0;
  132.                 if(HXR_OK == m_authValues->GetPropertyCString("Realm", pRealm))
  133.                 {
  134.                     str = CHXString("Basic realm=") +
  135.                         pRealm->GetBuffer();
  136.                 }
  137.                 else if(HXR_OK == m_authValues->GetPropertyCString(
  138.                     "Response", pResponse))
  139.                 {
  140.                     str = CHXString("Basic ") + pResponse->GetBuffer();
  141.                 }
  142.                 else if(HXR_OK == m_authValues->GetPropertyCString(
  143.                                                    "UserName", pUserName) &&
  144.                     HXR_OK == m_authValues->GetPropertyCString("Password",
  145.                                                                pPassword))
  146.                 {
  147.                     str = CHXString(pUserName->GetBuffer()) +
  148.                         ":" + pPassword->GetBuffer();
  149.                 }
  150.                 if(pUserName) pUserName->Release();
  151.                 if(pPassword) pPassword->Release();
  152.                 if(pResponse) pResponse->Release();
  153.                 if(pRealm) pRealm->Release();
  154.                 break;
  155.             }
  156.             default:
  157.                 str = "";
  158.                 break;
  159.         }
  160.     }
  161.     else
  162.     {
  163.         str = "";
  164.     }
  165. }
  166. CHXString
  167. HTTPAuthentication::asString()
  168. {
  169.     CHXString str;
  170.     asString(str);
  171.     return str;
  172. }
  173. HTTPMessage::HTTPMessage()
  174. {
  175.     setVersion(MAJ_VERSION, MIN_VERSION);
  176. }
  177. HTTPMessage::~HTTPMessage()
  178. {
  179.     clearHeaderList();
  180. }
  181. void
  182. HTTPMessage::addHeader(MIMEHeader* pHeader)
  183. {
  184.     m_headers.AddTail(pHeader);
  185. }
  186. void 
  187. HTTPMessage::addHeader(const char* pName, const char* pValue)
  188. {
  189.     MIMEHeader* pHeader = new MIMEHeader(pName);
  190.     pHeader->addHeaderValue(pValue);
  191.     addHeader(pHeader);
  192. }
  193. MIMEHeader*
  194. HTTPMessage::getHeader(const char* pName)
  195. {
  196.     LISTPOSITION pos = m_headers.GetHeadPosition();
  197.     while(pos)
  198.     {
  199. MIMEHeader* pHeader = (MIMEHeader*)m_headers.GetNext(pos);
  200. if(strcasecmp(pHeader->name(), pName) == 0)
  201. {
  202.     return pHeader;
  203. }
  204.     }
  205.     return 0;
  206. }
  207. CHXString
  208. HTTPMessage::getHeaderValue(const char* pName)
  209. {
  210.     MIMEHeader* pHeader = getHeader(pName);
  211.     if(pHeader)
  212.     {
  213. MIMEHeaderValue* pHeaderValue = pHeader->getFirstHeaderValue();
  214. if(pHeaderValue)
  215. {
  216.     return pHeaderValue->value();
  217. }
  218.     }
  219.     return CHXString("");
  220. }
  221. int
  222. HTTPMessage::getHeaderValue(const char* pName, UINT32& value)
  223. {
  224.     CHXString strValue = getHeaderValue(pName);
  225.     if(strValue != "")
  226.     {
  227. value = strtol((const char*)strValue, 0, 10);
  228. return 1;
  229.     }
  230.     return 0;
  231. }
  232. MIMEHeader*
  233. HTTPMessage::getFirstHeader()
  234. {
  235.     m_listpos = m_headers.GetHeadPosition();
  236.     if(m_listpos)
  237. return (MIMEHeader*)m_headers.GetNext(m_listpos);
  238.     return 0;
  239. }
  240. MIMEHeader*
  241. HTTPMessage::getNextHeader()
  242. {
  243.     if(m_listpos)
  244. return (MIMEHeader*)m_headers.GetNext(m_listpos);
  245.     return 0;
  246. }
  247. void
  248. HTTPMessage::clearHeaderList()
  249. {
  250.     MIMEHeader* pHeader = getFirstHeader();
  251.     while(pHeader)
  252.     {
  253. delete pHeader;
  254. pHeader = getNextHeader();
  255.     }
  256. }
  257. void 
  258. HTTPMessage::setContent(BYTE* pBuf, UINT32 pBufLen)
  259. {
  260.     m_content = CHXString((const char*)pBuf, HX_SAFEUINT(pBufLen));
  261. }
  262. int
  263. HTTPMessage::contentLength()
  264. {
  265.     return m_content.GetLength();
  266. }
  267. void
  268. HTTPRequestMessage::asString(char* pBuf, int& msgLen, UINT32 ulBufLen)
  269. {
  270. int lenTmpBuf = strlen(url()) + strlen(tagStr()) + 80;
  271.     char* tmpBuf = new char[lenTmpBuf];
  272.     SafeSprintf(tmpBuf, lenTmpBuf, "%s %s HTTP/%d.%drn",
  273. tagStr(), url(), majorVersion(), minorVersion());
  274.     CHXString msgStr = tmpBuf;
  275.     MIMEHeader* pHeader = getFirstHeader();
  276.     while(pHeader)
  277.     {
  278. msgStr += pHeader->name();
  279. msgStr += ": ";
  280. pHeader->asString(msgStr);
  281. pHeader = getNextHeader();
  282.     }
  283.     msgStr += "rn";
  284.     if(contentLength() > 0)
  285.     {
  286. msgStr += getContent();
  287.     }
  288.     SafeStrCpy(pBuf, msgStr, ulBufLen);
  289.     msgLen = strlen(pBuf);
  290.     delete[] tmpBuf;
  291. }
  292. void
  293. HTTPResponseMessage::asString(char* pMsg, int& msgLen, UINT32 ulBufLen)
  294. {
  295. int lenTmpBuf = 64 + m_errorMsg.GetLength();
  296.     char* pTmpBuf = new char[lenTmpBuf];
  297.     SafeSprintf
  298.     (
  299. pTmpBuf,  lenTmpBuf,
  300. "HTTP/%d.%d %s %srn",
  301. majorVersion(), 
  302. minorVersion(), 
  303. (const char*)m_errorCode,
  304. (const char*)m_errorMsg
  305.     );
  306.     CHXString msgStr = pTmpBuf;
  307.     delete[] pTmpBuf;
  308.     MIMEHeader* pHeader = getFirstHeader();
  309.     while(pHeader)
  310.     {
  311. msgStr += pHeader->name();
  312. msgStr += ": ";
  313. pHeader->asString(msgStr);
  314. pHeader = getNextHeader();
  315.     }
  316.     if(contentLength() > 0)
  317.     {
  318. msgStr += getContent();
  319.     }
  320.     msgStr += "rn";
  321.     SafeStrCpy(pMsg, msgStr, ulBufLen);
  322.     msgLen = strlen(pMsg);
  323. }