⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 http_handler.cpp

📁 ACE自适配通信环境(ADAPTIVE Communication Environment)是可以自由使用、开放源码的面向对象(OO)框架(Framework)
💻 CPP
字号:
// http_handler.cpp,v 1.17 2004/09/24 14:42:42 shuston Exp// ============================================================================//// = LIBRARY//    apps/JAWS/clients/Caching//// = FILENAME//    http_handler.cpp//// = AUTHOR//    James Hu//// ============================================================================#include "ace/OS_NS_stdio.h"#include "ace/OS_NS_string.h"#include "ace/Filecache.h"#include "http_handler.h"ACE_RCSID(Caching, http_handler, "http_handler.cpp,v 1.17 2004/09/24 14:42:42 shuston Exp")HTTP_Handler::HTTP_Handler (void){}HTTP_Handler::HTTP_Handler (const char * path){  // How long is the request going to be?  this->request_[0] = '\0';  this->request_size_ =    ACE_OS::strlen ("GET ")    + ACE_OS::strlen (path)    + ACE_OS::strlen (" HTTP/1.0\r\nAccept: HTTP/1.0\r\n\r\n");  // Make the request.  if ((u_int) this->request_size_ < sizeof (this->request_))    ACE_OS::sprintf (this->request_,                     "GET %s HTTP/1.0\r\nAccept: HTTP/1.0\r\n\r\n",                     path);  // Find the filename.  const char *last = ACE_OS::strrchr (path, '/');  if (last == 0)    last = path;  else if (last[1] == '\0')    last = "index.html";  else    last = last+1;  ACE_OS::sprintf (this->filename_, "%s", last);}intHTTP_Handler::open (void *){  // If you want threads, use the activate stuff.#if 0  if (this->activate () != 0)    {      ACE_ERROR_RETURN ((LM_ERROR, "HTTP_Handler::open, whups!\n"), -1);    }  return 0;#else  return this->svc ();#endif /* 0 */}intHTTP_Handler::svc (void){  static char buf[BUFSIZ];  int count = 0;  ACE_DEBUG ((LM_DEBUG, "[%t] sending request --\n%s", this->request_));  this->peer ().send_n (this->request_, this->request_size_);  // Read in characters until encounter \r\n\r\n  int done = 0;  char *contentlength;  do    {      while (((count += this->peer ().recv_n (buf + count, 1)) > 0)             && ((u_int) count < sizeof (buf)))        {          buf[count] = '\0';          if (count < 2)            continue;          done = ACE_OS::strcmp (buf + count - 4, "\n\n") == 0;          if (done)            break;          if (count < 4)            continue;          done = ACE_OS::strcmp (buf + count - 4, "\r\n\r\n") == 0;          if (done)            break;        }      if (!done)        {          char *last = ACE_OS::strrchr (buf, '\n');          last[0] = '\0';          if ((contentlength = ACE_OS::strstr (buf, "\nContent-length:"))              || (contentlength = ACE_OS::strstr (buf, "\nContent-Length:")))            done = 1;          else            {              last[0] = '\n';              count = ACE_OS::strlen (last);              ACE_OS::memmove (buf, last, count + 1);            }        }      else        {          contentlength = ACE_OS::strstr (buf, "\nContent-length:");          if (!contentlength)            contentlength =              ACE_OS::strstr (buf, "\nContent-Length:");        }    }  while (!done);  // ASSERT (contentlength != 0)  if (contentlength      && (::sscanf (contentlength, "\nContent-%*[lL]ength: %d ",                    &this->response_size_) == 1))    {      ACE_Filecache_Handle afh (ACE_TEXT_CHAR_TO_TCHAR (this->filename_),                                this->response_size_);      this->peer ().recv_n (afh.address (), this->response_size_);      ACE_DEBUG ((LM_DEBUG,                  "  ``%s'' is now cached.\n",                  this->filename_));    }  else    {      // Maybe we should do something more clever here, such as extend      // ACE_Filecache_Handle to allow the creation of cache objects      // whose size is unknown?      // Another possibility is to write the contents out to a file,      // and then cache it.      // Perhaps make ACE_Filecache_Handle more savvy, and allow a      // constructor which accepts a PEER as a parameter.      ACE_DEBUG ((LM_DEBUG,                  "HTTP_Handler, no content-length header!\n"));    }  return 0;}const char *HTTP_Handler::filename (void) const{  return this->filename_;}intHTTP_Connector::connect (const char * url){  char host[BUFSIZ];  u_short port;  char path[BUFSIZ];  if (this->parseurl (url, host, &port, path) == -1)    {      ACE_DEBUG ((LM_DEBUG,                  "HTTP_Connector, error parsing url: %s\n",                  url));      return -1;    }  HTTP_Handler hh (path);  HTTP_Handler *hhptr = &hh;  // First check the cache.  if (ACE_Filecache::instance ()->find (ACE_TEXT_CHAR_TO_TCHAR (hh.filename ())) == 0)    {      ACE_DEBUG ((LM_DEBUG, "  ``%s'' is already cached.\n",                  hh.filename ()));      return 0;    }  return this->connector_.connect (hhptr, ACE_INET_Addr (port, host));}#define DEFAULT_SERVER_PORT 80// extract the main components of a URLintHTTP_Connector::parseurl (const char *url,                          char *host,                          u_short *port,                          char *path){  int status = 0;  // hackish, but useful  if (3 != ::sscanf (url, "http://%[^:/]:%hu%s", host, port, path))    {      if (2 != ::sscanf (url, "http://%[^:/]:%hu", host, port))        {          if (2 != ::sscanf (url, "http://%[^:/]%s", host, path))            {              if (1 != ::sscanf (url, "http://%[^:/]", host))                status = -1;              else                {                  *port = DEFAULT_SERVER_PORT;                  ACE_OS::strcpy (path, "/");                }            }          else            *port = DEFAULT_SERVER_PORT;        }      else ACE_OS::strcpy (path, "/");    }  // 0 => success  // -1 => error  return status;}#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)template class ACE_Connector_Base<HTTP_Handler>;template class ACE_Connector<HTTP_Handler, ACE_SOCK_CONNECTOR>;template class ACE_NonBlocking_Connect_Handler<HTTP_Handler>;template class ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH>;#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)#pragma instantiate ACE_Connector_Base<HTTP_Handler>#pragma instantiate ACE_Connector<HTTP_Handler, ACE_SOCK_CONNECTOR>#pragma instantiate ACE_NonBlocking_Connect_Handler<HTTP_Handler>#pragma instantiate ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH>#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -