📄 http.cxx
字号:
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
if( ShellExecute(NULL, "open", url,
NULL, NULL, SW_SHOWNORMAL) != 0 )
return TRUE;
#endif
#if 0
#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
#endif
return FALSE;
}
void PURL::Recalculate()
{
//if (scheme.IsEmpty())
// scheme = SchemeTable[DEFAULT_SCHEME].name;
if (scheme.IsEmpty())
scheme = DEFAULT_SCHEME;
urlString = AsString(HostPortOnly) + AsString(URIOnly);
}
//////////////////////////////////////////////////////////////////////////////
// PHTTP
static 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 + -