HttpResponseHeader.cpp
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:8k
源码类别:

CA认证

开发平台:

Visual C++

  1. /*
  2. Module : HttpResponseHeader.cpp
  3. Purpose: Implementation for a class to simplify sending Http response headers
  4. Created: PJN / 22-04-1999
  5. History: None                    
  6. Copyright (c) 1999 - 2005 by PJ Naughter.  
  7. All rights reserved.
  8. Copyright / Usage Details:
  9. You are allowed to include the source code in any product (commercial, shareware, freeware or otherwise) 
  10. when your product is released in binary form. You are allowed to modify the source code in any way you want 
  11. except you cannot modify the copyright details at the top of each module. If you want to distribute source 
  12. code with your application, then you are only allowed to distribute versions released by the author. This is 
  13. to maintain a single distribution point for the source code. 
  14. */
  15. //////////////// Includes ////////////////////////////////////////////
  16. #include "stdafx.h"
  17. #ifndef __AFXPRIV_H__
  18. #pragma message("To avoid this message please put afxpriv.h in your PCH (normally stdafx.h)")
  19. #include <afxpriv.h>
  20. #endif
  21. #include "HttpResponseHeader.h"
  22. //////////////// Macros //////////////////////////////////////////////
  23. #ifdef _DEBUG
  24. #define new DEBUG_NEW
  25. #undef THIS_FILE
  26. static char THIS_FILE[] = __FILE__;
  27. #endif
  28. //////////////// Implementation //////////////////////////////////////
  29. CHttpResponseHeader::CHttpResponseHeader()
  30. {
  31.   m_bEntitySeparator = TRUE;
  32. }
  33. void CHttpResponseHeader::SetAddEntitySeparator(BOOL bSeparator)
  34. {
  35.   m_bEntitySeparator = bSeparator;
  36. }
  37. void CHttpResponseHeader::AddStatus(LPCSTR pszStatusString)
  38. {
  39.   CString sLine;
  40.   sLine.Format(_T("HTTP/1.0 %srn"), pszStatusString);
  41.   m_sHeader += sLine;
  42. }
  43. void CHttpResponseHeader::AddExtraHeaders(LPCSTR pszHeaders)
  44. {
  45.   m_sHeader += pszHeaders;
  46. }
  47. void CHttpResponseHeader::AddStatusCode(int nStatusCode)
  48. {
  49.   CString sLine;
  50.   switch (nStatusCode)
  51.   {
  52.     case 200: sLine = _T("HTTP/1.0 200 OKrn");                    break;
  53.     case 201: sLine = _T("HTTP/1.0 201 Createdrn");               break;
  54.     case 202: sLine = _T("HTTP/1.0 202 Acceptedrn");              break;
  55.     case 204: sLine = _T("HTTP/1.0 204 No Contentrn");            break;
  56.     case 300: sLine = _T("HTTP/1.0 300 Multiple Choicesrn");      break;
  57.     case 301: sLine = _T("HTTP/1.0 301 Moved Permanentlyrn");     break;
  58.     case 302: sLine = _T("HTTP/1.0 302 Moved Temporarilyrn");     break;
  59.     case 304: sLine = _T("HTTP/1.0 304 Not Modifiedrn");          break;
  60.     case 400: sLine = _T("HTTP/1.0 400 Bad Requestrn");           break;
  61.     case 401: sLine = _T("HTTP/1.0 401 Unauthorizedrn");          break;
  62.     case 403: sLine = _T("HTTP/1.0 403 Forbiddenrn");             break;
  63.     case 404: sLine = _T("HTTP/1.0 404 Not Foundrn");             break;
  64.     case 500: sLine = _T("HTTP/1.0 500 Internal Server Errorrn"); break;
  65.     case 501: sLine = _T("HTTP/1.0 501 Not Implementedrn");       break;
  66.     case 502: sLine = _T("HTTP/1.0 502 Bad Gatewayrn");           break;
  67.     case 503: sLine = _T("HTTP/1.0 503 Service Unavailablern");   break;
  68.     default: sLine.Format(_T("HTTP/1.0 %drn"), nStatusCode);      break;
  69.   }
  70.   m_sHeader += sLine;
  71. }
  72. void CHttpResponseHeader::AddContentLength(int nSize)
  73. {
  74.   CString sLine;
  75.   sLine.Format(_T("Content-Length: %drn"), nSize);
  76.   m_sHeader += sLine;
  77. }
  78. void CHttpResponseHeader::AddContentType(const CString& sMediaType)
  79. {
  80.   CString sLine;
  81.   sLine.Format(_T("Content-Type: %srn"), sMediaType);
  82.   m_sHeader += sLine;
  83. }
  84. CString CHttpResponseHeader::DateToStr(const SYSTEMTIME& st)
  85. {
  86.   static TCHAR* sMonth[] =  
  87.   {
  88.     _T(""),
  89.     _T("Jan"),
  90.     _T("Feb"),
  91.     _T("Mar"), 
  92.     _T("Apr"),
  93.     _T("May"),
  94.     _T("Jun"),
  95.     _T("Jul"),
  96.     _T("Aug"),
  97.     _T("Sep"),
  98.     _T("Oct"),
  99.     _T("Nov"),
  100.     _T("Dec"),
  101.   };
  102.   static TCHAR* sDay[] =
  103.   {
  104.     _T("Sun"),
  105.     _T("Mon"),
  106.     _T("Tue"), 
  107.     _T("Wed"),
  108.     _T("Thu"),
  109.     _T("Fri"),
  110.     _T("Sat"),
  111.   };
  112.   CString sDate;
  113.   sDate.Format(_T("%s, %02d %s %04d %02d:%02d:%02d GMT"), sDay[st.wDayOfWeek], 
  114.                st.wDay, sMonth[st.wMonth], st.wYear, st.wHour, st.wMinute, st.wSecond);
  115.   return sDate;
  116. }
  117. void CHttpResponseHeader::AddW3MfcAllowFields(BOOL bAllowDeleteRequest)
  118. {
  119.   if (bAllowDeleteRequest)
  120.     m_sHeader += _T("Allow: GET, POST, HEAD, DELETErn");
  121.   else
  122.     m_sHeader += _T("Allow: GET, POST, HEADrn");
  123. }
  124. void CHttpResponseHeader::AddDate(const SYSTEMTIME& st)
  125. {
  126.   CString sDate = DateToStr(st);
  127.   CString sLine;
  128.   sLine.Format(_T("Date: %srn"), sDate);
  129.   m_sHeader += sLine;
  130. }
  131. void CHttpResponseHeader::AddLastModified(const SYSTEMTIME& st)
  132. {
  133.   CString sDate = DateToStr(st);
  134.   CString sLine;
  135.   sLine.Format(_T("Last-Modified: %srn"), sDate);
  136.   m_sHeader += sLine;
  137. }
  138. void CHttpResponseHeader::AddExpires(const SYSTEMTIME& st)
  139. {
  140.   CString sDate = DateToStr(st);
  141.   CString sLine;
  142.   sLine.Format(_T("Expires: %srn"), sDate);
  143.   m_sHeader += sLine;
  144. }
  145. void CHttpResponseHeader::AddKeepAlive()
  146. {
  147.   m_sHeader += _T("Connection: Keep-Alivern");
  148. }
  149. void CHttpResponseHeader::AddWWWAuthenticateBasic(const CString& sRealm)
  150. {
  151.   CString sLine;
  152.   sLine.Format(_T("WWW-Authenticate: Basic realm=%srn"), sRealm);
  153.   m_sHeader += sLine;
  154. }
  155. void CHttpResponseHeader::AddWWWAuthenticateNTLM(const CString& sMessage)
  156. {
  157.   CString sLine;
  158.   if (sMessage.GetLength())
  159.     sLine.Format(_T("WWW-Authenticate: NTLM %srn"), sMessage);
  160.   else
  161.     sLine = _T("WWW-Authenticate: NTLMrn");
  162.   m_sHeader += sLine;
  163. }
  164. void CHttpResponseHeader::AddLocation(const CString& sLocation)
  165. {
  166.   CString sLine;
  167.   sLine.Format(_T("Location: %srn"), sLocation);
  168.   m_sHeader += sLine;
  169. }
  170. void CHttpResponseHeader::AddServer(const CString& sServer)
  171. {
  172.   CString sLine;
  173.   sLine.Format(_T("Server: %srn"), sServer);
  174.   m_sHeader += sLine;    
  175. }
  176. BOOL CHttpResponseHeader::Send(CHttpSocket& socket, DWORD dwTimeout)
  177. {
  178.   //Get the ascii version of the data
  179.   DWORD dwSize = 0;
  180.   char* pszData = GetData(dwSize);
  181.   //Send it down the socket  
  182.   BOOL bSuccess = TRUE; //assume the best
  183.   try
  184.   {
  185.     socket.SendWithRetry(pszData, dwSize, dwTimeout);
  186.   }
  187.   catch(CWSocketException* pEx)
  188.   {
  189.     TRACE(_T("CHttpResponseHeader::Send, Error:%dn"), pEx->m_nError);
  190.     pEx->Delete();  
  191.     bSuccess = FALSE;
  192.   }
  193.   //Tidy up the heap memory we have used
  194.   delete [] pszData;
  195.   return bSuccess;
  196. }
  197. #ifdef W3MFC_SSL_SUPPORT
  198. BOOL CHttpResponseHeader::Send(CHttpSocket& socket, DWORD dwTimeout, CSSL& ssl)
  199. {
  200.   BOOL bSuccess = TRUE; //assume the best
  201.   if (ssl.operator SSL*())
  202.   {
  203.     //Get the ascii version of the data
  204.     DWORD dwSize = 0;
  205.     char* pszData = GetData(dwSize);
  206.     //Send it down the socket  
  207.     try
  208.     {
  209.       socket.SendWithRetry(pszData, dwSize, dwTimeout, ssl);
  210.     }
  211.     catch(CWSocketException* pEx)
  212.     {
  213.       TRACE(_T("CHttpResponseHeader::Send, Error:%dn"), pEx->m_nError);
  214.       pEx->Delete();  
  215.       bSuccess = FALSE;
  216.     }
  217.     //Tidy up the heap memory we have used
  218.     delete [] pszData;
  219.   }
  220.   else
  221.     bSuccess = Send(socket, dwTimeout);
  222.   return bSuccess;
  223. }
  224. #endif
  225. char* CHttpResponseHeader::GetData(DWORD& dwSize)
  226. {
  227.   //Allocate some string space from the heap
  228.   int nLength = m_sHeader.GetLength();
  229. #ifdef _UNICODE
  230. int nBytes = WideCharToMultiByte(CP_ACP, 0, m_sHeader, nLength, NULL, NULL, NULL, NULL);
  231.   nBytes += 3;
  232.   char* pszData = new char[nBytes];
  233.   nBytes = WideCharToMultiByte(CP_ACP, 0, m_sHeader, nLength, pszData, nBytes, NULL, NULL);  
  234.   pszData[nBytes] = '';
  235. #else
  236.   dwSize = nLength + 3;
  237.   char* pszData = new char[dwSize];
  238.   strcpy(pszData, m_sHeader);
  239. #endif
  240.   if (m_bEntitySeparator)
  241.     strcat(pszData, "rn");
  242.   dwSize = strlen(pszData);
  243.   return pszData;
  244. }