📄 http.cxx
字号:
port = (WORD)uphp.Mid(pos+1).AsUnsigned(); portSupplied = TRUE; } if (hostname.IsEmpty() && schemeInfo->defaultHostToLocal) hostname = PIPSocket::GetHostName(); } } if (schemeInfo->hasQuery) { // chop off any trailing query pos = url.Find('?'); if (pos != P_MAX_INDEX) { SplitQueryVars(url(pos+1, P_MAX_INDEX), queryVars); url.Delete(pos, P_MAX_INDEX); } } if (schemeInfo->hasParameters) { // chop off any trailing parameters pos = url.Find(';'); if (pos != P_MAX_INDEX) { SplitVars(url(pos+1, P_MAX_INDEX), paramVars, ';', '='); url.Delete(pos, P_MAX_INDEX); } } if (schemeInfo->hasFragments) { // chop off any trailing fragment pos = url.Find('#'); if (pos != P_MAX_INDEX) { fragment = UntranslateString(url(pos+1, P_MAX_INDEX), PathTranslation); url.Delete(pos, P_MAX_INDEX); } } if (schemeInfo->hasPath) SetPathStr(url); // the hierarchy is what is left else { // if the rest of the URL isn't a path, then we are finished! pathStr = UntranslateString(url, PathTranslation); Recalculate(); } if (port == 0 && schemeInfo->defaultPort != 0 && !relativePath) { // Yes another horrible, horrible special case! if (scheme == "h323" && paramVars("type") == "gk") port = DEFAULT_H323RAS_PORT; else port = schemeInfo->defaultPort; Recalculate(); } return TRUE;}PFilePath PURL::AsFilePath() const{ //if (scheme != SchemeTable[FILE_SCHEME].name) // return PString::Empty(); if (scheme != FILE_SCHEME) return PString::Empty(); PStringStream str; if (relativePath) { for (PINDEX i = 0; i < path.GetSize(); i++) { if (i > 0) str << PDIR_SEPARATOR; str << path[i]; } } else { if (hostname != "localhost") str << PDIR_SEPARATOR << hostname; for (PINDEX i = 0; i < path.GetSize(); i++) str << PDIR_SEPARATOR << path[i]; } return str;}PString PURL::AsString(UrlFormat fmt) const{ if (fmt == FullURL) return urlString; if (scheme.IsEmpty()) return PString::Empty(); //const schemeStruct * schemeInfo = GetSchemeInfo(scheme); //if (schemeInfo == NULL) // schemeInfo = &SchemeTable[PARRAYSIZE(SchemeTable)-1]; const PURLScheme * schemeInfo = PFactory<PURLScheme>::CreateInstance(scheme); if (schemeInfo == NULL) schemeInfo = PFactory<PURLScheme>::CreateInstance(DEFAULT_SCHEME); return schemeInfo->AsString(fmt, *this);}PString PURL::LegacyAsString(PURL::UrlFormat fmt, const PURLLegacyScheme * schemeInfo) const{ PStringStream str; PINDEX i; if (fmt == HostPortOnly) { if (schemeInfo->hasHostPort && hostname.IsEmpty()) return str; str << scheme << ':'; if (relativePath) { if (schemeInfo->relativeImpliesScheme) return PString::Empty(); return str; } if (schemeInfo->hasPath && schemeInfo->hasHostPort) str << "//"; if (schemeInfo->hasUsername) { if (!username) { str << TranslateString(username, LoginTranslation); if (schemeInfo->hasPassword && !password) str << ':' << TranslateString(password, LoginTranslation); str << '@'; } } if (schemeInfo->hasHostPort) { if (hostname.Find(':') != P_MAX_INDEX) str << '[' << hostname << ']'; else str << hostname; } if (schemeInfo->defaultPort != 0) { if (port != schemeInfo->defaultPort || portSupplied) str << ':' << port; } return str; } // URIOnly and PathOnly if (schemeInfo->hasPath) { for (i = 0; i < path.GetSize(); i++) { if (i > 0 || !relativePath) str << '/'; str << TranslateString(path[i], PathTranslation); } } else str << TranslateString(pathStr, PathTranslation); if (fmt == URIOnly) { if (!fragment) str << "#" << TranslateString(fragment, PathTranslation); for (i = 0; i < paramVars.GetSize(); i++) { str << ';' << TranslateString(paramVars.GetKeyAt(i), QueryTranslation); PString data = paramVars.GetDataAt(i); if (!data) str << '=' << TranslateString(data, QueryTranslation); } if (!queryVars.IsEmpty()) str << '?' << GetQuery(); } return str;}void PURL::SetScheme(const PString & s){ scheme = s; Recalculate();}void PURL::SetUserName(const PString & u){ username = u; Recalculate();}void PURL::SetPassword(const PString & p){ password = p; Recalculate();}void PURL::SetHostName(const PString & h){ hostname = h; Recalculate();}void PURL::SetPort(WORD newPort){ port = newPort; Recalculate();}void PURL::SetPathStr(const PString & p){ pathStr = p; path = pathStr.Tokenise("/", TRUE); if (path.GetSize() > 0 && path[0].IsEmpty()) path.RemoveAt(0); for (PINDEX i = 0; i < path.GetSize(); i++) { path[i] = UntranslateString(path[i], PathTranslation); if (i > 0 && path[i] == ".." && path[i-1] != "..") { path.RemoveAt(i--); path.RemoveAt(i--); } } Recalculate();}void PURL::SetPath(const PStringArray & p){ path = p; pathStr.MakeEmpty(); for (PINDEX i = 0; i < path.GetSize(); i++) pathStr += '/' + path[i]; Recalculate();}PString PURL::GetParameters() const{ PStringStream str; for (PINDEX i = 0; i < paramVars.GetSize(); i++) { if (i > 0) str << ';'; str << paramVars.GetKeyAt(i); PString data = paramVars.GetDataAt(i); if (!data) str << '=' << data; } return str;}void PURL::SetParameters(const PString & parameters){ SplitVars(parameters, paramVars, ';', '='); Recalculate();}void PURL::SetParamVars(const PStringToString & p){ paramVars = p; Recalculate();}void PURL::SetParamVar(const PString & key, const PString & data){ if (data.IsEmpty()) paramVars.RemoveAt(key); else paramVars.SetAt(key, data); Recalculate();}PString PURL::GetQuery() const{ PStringStream str; for (PINDEX i = 0; i < queryVars.GetSize(); i++) { if (i > 0) str << '&'; str << TranslateString(queryVars.GetKeyAt(i), QueryTranslation) << '=' << TranslateString(queryVars.GetDataAt(i), QueryTranslation); } return str;}void PURL::SetQuery(const PString & queryStr){ SplitQueryVars(queryStr, queryVars); Recalculate();}void PURL::SetQueryVars(const PStringToString & q){ queryVars = q; Recalculate();}void PURL::SetQueryVar(const PString & key, const PString & data){ if (data.IsEmpty()) queryVars.RemoveAt(key); else queryVars.SetAt(key, data); Recalculate();}BOOL PURL::OpenBrowser(const PString & url){#ifdef WIN32 SHELLEXECUTEINFO sei; ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO)); sei.cbSize = sizeof(SHELLEXECUTEINFO); sei.lpVerb = TEXT("open"); #ifndef _WIN32_WCE sei.lpFile = url; #else USES_CONVERSION; sei.lpFile = A2T(url); #endif // _WIN32_WCE if (ShellExecuteEx(&sei) != 0) return TRUE;#ifndef _WIN32_WCE MessageBox(NULL, "Unable to open page"&url, PProcess::Current().GetName(), MB_TASKMODAL);#else MessageBox(NULL, _T("Unable to open page"), A2T(PProcess::Current().GetName()), MB_APPLMODAL);#endif // _WIN32_WCE#endif // WIN32 return FALSE;}void PURL::Recalculate(){ //if (scheme.IsEmpty()) // scheme = SchemeTable[DEFAULT_SCHEME].name; if (scheme.IsEmpty()) scheme = DEFAULT_SCHEME; urlString = AsString(HostPortOnly) + AsString(URIOnly);}//////////////////////////////////////////////////////////////////////////////// PHTTPstatic char const * const HTTPCommands[PHTTP::NumCommands] = { // HTTP 1.0 commands "GET", "HEAD", "POST", // HTTP 1.1 commands "PUT", "DELETE", "TRACE", "OPTIONS", // HTTPS command "CONNECT"};const char * const PHTTP::AllowTag = "Allow";const char * const PHTTP::AuthorizationTag = "Authorization";const char * const PHTTP::ContentEncodingTag = "Content-Encoding";const char * const PHTTP::ContentLengthTag = "Content-Length";const char * const PHTTP::ContentTypeTag = "Content-Type";const char * const PHTTP::DateTag = "Date";const char * const PHTTP::ExpiresTag = "Expires";const char * const PHTTP::FromTag = "From";const char * const PHTTP::IfModifiedSinceTag = "If-Modified-Since";const char * const PHTTP::LastModifiedTag = "Last-Modified";const char * const PHTTP::LocationTag = "Location";const char * const PHTTP::PragmaTag = "Pragma";const char * const PHTTP::PragmaNoCacheTag = "no-cache";const char * const PHTTP::RefererTag = "Referer";const char * const PHTTP::ServerTag = "Server";const char * const PHTTP::UserAgentTag = "User-Agent";const char * const PHTTP::WWWAuthenticateTag = "WWW-Authenticate";const char * const PHTTP::MIMEVersionTag = "MIME-Version";const char * const PHTTP::ConnectionTag = "Connection";const char * const PHTTP::KeepAliveTag = "Keep-Alive";const char * const PHTTP::TransferEncodingTag= "Transfer-Encoding";const char * const PHTTP::ChunkedTag = "chunked";const char * const PHTTP::ProxyConnectionTag = "Proxy-Connection";const char * const PHTTP::ProxyAuthorizationTag = "Proxy-Authorization";const char * const PHTTP::ProxyAuthenticateTag = "Proxy-Authenticate";const char * const PHTTP::ForwardedTag = "Forwarded";const char * const PHTTP::SetCookieTag = "Set-Cookie";const char * const PHTTP::CookieTag = "Cookie";PHTTP::PHTTP() : PInternetProtocol("www 80", NumCommands, HTTPCommands){}PINDEX PHTTP::ParseResponse(const PString & line){ PINDEX endVer = line.Find(' '); if (endVer == P_MAX_INDEX) { lastResponseInfo = "Bad response"; lastResponseCode = PHTTP::InternalServerError; return 0; } lastResponseInfo = line.Left(endVer); PINDEX endCode = line.Find(' ', endVer+1); lastResponseCode = line(endVer+1,endCode-1).AsInteger(); if (lastResponseCode == 0) lastResponseCode = PHTTP::InternalServerError; lastResponseInfo &= line.Mid(endCode); return 0;}// End Of File ///////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -