📄 parse_url.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 + -