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

📄 parse_url.cpp

📁 ACE自适配通信环境(ADAPTIVE Communication Environment)是可以自由使用、开放源码的面向对象(OO)框架(Framework)
💻 CPP
字号:
// parse_url.cpp,v 1.3 2003/11/01 11:15:22 dhinton Exp#include "ace/OS_NS_string.h"#include "ace/OS_NS_stdlib.h"#include "ace/Log_Msg.h"#include "HTTPU/parse_url.h"HTTP_Parse_URL::HTTP_Parse_URL (const char *url)  : url_ (0),    scheme_ (0),    user_ (0),    passwd_ (0),    host_ (0),    port_ (-1),    url_path_ (0),    error_ (NONE),    is_cgi_ (0){  this->init (url);}HTTP_Parse_URL::~HTTP_Parse_URL (void){  if (this->url_)    ACE_OS::free (this->url_);  this->url_ = 0;  this->scheme_ = 0;  this->user_ = 0;  this->passwd_ = 0;  this->host_ = 0;  this->port_ = -1;  this->url_path_ = 0;}voidHTTP_Parse_URL::init( const char *url ){   // Should really reset completely and cleanly here before   // doing anything else!   if ( url == 0 )      return;   if ( url_ )      ACE_OS::free( url_ );   url_ = ACE_OS::strdup( url );   if ( url_ == 0 )   {      error_ = STRDUP;      return;   }  if (ACE_OS::strlen (this->url_) > 3 && ACE_OS::strstr ("://", this->url_))    {      // Parse it out completely.  Figure out what it is later.      parse_url();    }  else    {      this->url_path_ = this->url_;      this->is_cgi (this->url_path_);    }}voidHTTP_Parse_URL::parse_url (void){  char *p = this->url_;  char *q;  if ((q = ACE_OS::strchr (this->url_, '\r'))      || (q = ACE_OS::strchr (this->url_, '\n')))    *q = '\0';  this->parse_scheme (p);  if (*p == '\0')    {      this->error_ = SCHEME;      return;    }  // Parse past "//"  if (*p != '/' || *(p+1) != '/')    {      this->error_ = SLASHSLASH;      return;    }  p += 2;  this->parse_host (p);  while (*p == '/')    p++;  if (*p == '\0')    return;  this->url_path_ = p;  this->is_cgi (this->url_path_);}voidHTTP_Parse_URL::parse_scheme (char *&p){  // Parse the scheme.  The scheme is delimited by a ':'.  if (*p != '\0')    {      this->scheme_ = p++;      for (;;)        {          switch (*p)            {            case '\0':              break;            case ':':              *p++ = '\0';              break;            default:              p++;              continue;            }          break;        }    }}voidHTTP_Parse_URL::parse_host (char *&p){  // Parse user, password, host, port  if (*p == '/' || *p == '\0')    {      this->set_port_from_scheme ();      return;    }  char *at = 0;  char *colon1 = 0;  char *colon2 = 0;  char *q = p;  while (*q != '\0')    {      if (*q == '/')        {          *q = '\0';          q++;          break;        }      if (*q == ':')        {          if (colon1 == 0)            {              if (at != 0 && colon2 == 0)                colon2 = q;              else                colon1 = q;            }          else            {              if (at != 0 && colon2 == 0)                colon2 = q;            }        }      if (*q == '@')        {          if (at == 0)            at = q;        }      q++;    }  // no user, no port  if (at == 0 && colon1 == 0)    {      if (*p != '\0' && *p != '/')        this->host_ = p;    }  // no user, port  else if (at == 0 && colon1 != 0)    {      if (p != colon1)        this->host_ = p;      *colon1++ = '\0';      this->port_ = ACE_OS::atoi (colon1);    }  // user, no passwd, no port  else if (at != 0 && colon1 == 0 && colon2 == 0)    {      this->user_ = p;      *at++ = '\0';      if (*at != '\0' && *at != '/')        this->host_ = at;    }  // user, no passwd, port  else if (at != 0 && colon1 == 0 && colon2 != 0)    {      this->user_ = p;      *at++ = '\0';      if (at != colon2)        this->host_ = at;      *colon2++ = '\0';      this->port_ = ACE_OS::atoi (colon2);    }  // user, passwd, no port  else if (at != 0 && colon1 != 0 && colon2 == 0)    {      this->user_ = p;      *colon1++ = '\0';      this->passwd_ = colon1;      *at++ = '\0';      if (*at != '\0')        this->host_ = at;    }  // user, passwd, and port  else if (at != 0 && colon1 != 0 && colon2 != 0)    {      this->user_ = p;      *colon1++ = '\0';      this->passwd_ = colon1;      *at++ = '\0';      if (at != colon2)        this->host_ = at;      *colon2++ = '\0';      this->port_ = ACE_OS::atoi (colon2);    }  // impossible!  else    {      ACE_ERROR ((LM_ERROR, "uh oh!\n"));      p = q;      return;    }  this->set_port_from_scheme ();  p = q;}voidHTTP_Parse_URL::set_port_from_scheme (void){  if (ACE_OS::strcmp (this->scheme_, "ftp") == 0)    {      if (this->port_ == -1)        this->port_ = 21;      if (this->user_ == 0)        {          this->user_ = "anonymous";          // *** need something better here          this->passwd_ = "a@b.c";        }    }  else if (ACE_OS::strcmp (this->scheme_, "http") == 0)    {      if (this->port_ == -1)        this->port_ = 80;    }}const char *HTTP_Parse_URL::scheme (void) const{  return this->scheme_;}const char *HTTP_Parse_URL::user (void) const{  return this->user_;}const char *HTTP_Parse_URL::passwd (void) const{  return this->passwd_;}const char *HTTP_Parse_URL::host (void) const{  return this->host_;}intHTTP_Parse_URL::port (void) const{  return this->port_;}const char *HTTP_Parse_URL::url_path (void) const{  return this->url_path_ ? this->url_path_ : "";}voidHTTP_Parse_URL::is_cgi (const char *path){  int yes;  yes = (ACE_OS::strchr (path, '?') != 0);  if (!yes && (ACE_OS::strlen (path) >= 3))    yes = (ACE_OS::strstr (path, "cgi") != 0);  if (!yes)    yes = (ACE_OS::strstr (path, "asp") != 0);  this->is_cgi_ = yes;}intHTTP_Parse_URL::is_cgi (void) const{  return this->is_cgi_;}

⌨️ 快捷键说明

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