added: std::wstring Request::subdomain

support for subdomains



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@828 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
2012-04-22 18:23:44 +00:00
parent bcea4f9464
commit baf10a9ba9
17 changed files with 110 additions and 11 deletions

View File

@@ -446,6 +446,7 @@ void App::ReadRequest()
CheckRequestMethod();
CheckFCGIRole();
CheckSSL();
SetSubdomain();
LogAccess();
@@ -531,6 +532,12 @@ void App::CheckSSL()
}
void App::SetSubdomain()
{
CreateSubdomain(config.base_url.c_str(), cur.request->env_http_host, cur.request->subdomain);
}
void App::LogAccess()
{
log.PutDate(log1);

View File

@@ -146,6 +146,7 @@ private:
void CheckRequestMethod();
void CheckFCGIRole();
void CheckSSL();
void SetSubdomain();
void PrepareSessionCookie();
void AddDebugInfo(std::wstring & out);

View File

@@ -711,4 +711,49 @@ void RemovePostFileTmp(PostFileTab & post_file_tab);
/*
short_str is removed from long_str (and a last dots are removed too)
and the result is stored in out
sample:
short_str: "mydomain.tld"
long_str: "www.subdomain.mydomain.tld"
out: "www.subdomain"
short_str: "mydomain.tld"
long_str: "otherdifferentstring"
out: ""
*/
template<class StringType1, class StringType2, class StringType3>
void CreateSubdomain(const StringType1 * short_str, const StringType2 * long_str, StringType3 & out)
{
size_t i1, i2;
out.clear();
for(i1=0 ; short_str[i1] != 0 ; ++i1);
for(i2=0 ; long_str[i2] != 0 ; ++i2);
if( i1 >= i2 )
return;
// i1 is < i2
while( i1-- > 0 )
{
i2 -= 1;
if( short_str[i1] != long_str[i2] )
return; // short_str is not a last substring of long_str
}
while( i2>0 && long_str[i2-1] == '.' )
i2 -= 1;
for(i1=0 ; i1 < i2 ; ++i1)
out += long_str[i1];
}
#endif

View File

@@ -86,6 +86,8 @@ void Request::Clear()
start_time = 0;
memset(&start_tm, 0, sizeof(start_tm));
subdomain.clear();
}

View File

@@ -133,6 +133,10 @@ struct Request
time_t start_time;
tm start_tm;
// a subdomain
// subdomain = HTTP_HOST environment variable - config->base_url
std::wstring subdomain;
Request();

View File

@@ -126,6 +126,13 @@ bool ssl = false;
void System::RedirectTo(const Item & item, const wchar_t * postfix)
{
PutUrlProto(config->use_ssl, cur->request->redirect_to);
if( !cur->request->subdomain.empty() )
{
cur->request->redirect_to += cur->request->subdomain;
cur->request->redirect_to += '.';
}
cur->request->redirect_to += config->base_url;
if( item.type == Item::dir )
@@ -152,6 +159,13 @@ void System::RedirectTo(const Item & item, const wchar_t * postfix)
void System::RedirectTo(long item_id, const wchar_t * postfix)
{
PutUrlProto(config->use_ssl, cur->request->redirect_to);
if( !cur->request->subdomain.empty() )
{
cur->request->redirect_to += cur->request->subdomain;
cur->request->redirect_to += '.';
}
cur->request->redirect_to += config->base_url;
Item * pdir = dirs.GetDir(item_id);
@@ -193,6 +207,13 @@ void System::RedirectTo(long item_id, const wchar_t * postfix)
void System::RedirectTo(const wchar_t * url)
{
PutUrlProto(config->use_ssl, cur->request->redirect_to);
if( !cur->request->subdomain.empty() )
{
cur->request->redirect_to += cur->request->subdomain;
cur->request->redirect_to += '.';
}
cur->request->redirect_to += config->base_url;
if( url[0] == '/' )