added: Request::header_in (Space) http input headers (without cookies)

added: config parameter: log_env_http_variables (bool) (for logging http headers)
added: support for DELETE http method, added method FunctionBase::MakeDelete()
changed: winix version incremented to 0.6.6




git-svn-id: svn://ttmath.org/publicrep/winix/trunk@1100 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
2018-04-25 19:48:47 +00:00
parent b01db89942
commit ca14b1a427
11 changed files with 169 additions and 14 deletions

View File

@@ -711,6 +711,22 @@ void App::LogEnvironmentVariables()
}
void App::LogEnvironmentHTTPVariables()
{
PT::Space::Table::iterator i = cur.request->headers_in.table.begin();
for( ; i != cur.request->headers_in.table.end() ; ++i)
{
log << log1 << "HTTP Env: " << i->first << "=";
if( i->second.size() == 1 )
log << i->second[0] << logend;
else
log << "(incorrect value table size, should be one but is " << i->second.size() << ")" << logend;
}
}
/*
* reading the request (without GET parameters in the URL)
@@ -724,6 +740,7 @@ void App::ReadRequest()
SetSubdomain();
LogAccess();
ReadEnvHTTPVariables();
ReadPostVars();
@@ -733,6 +750,9 @@ void App::ReadRequest()
if( config.log_env_variables )
LogEnvironmentVariables();
if( config.log_env_http_variables )
LogEnvironmentHTTPVariables();
CheckIE();
CheckKonqueror();
@@ -759,17 +779,102 @@ void App::ReadEnvVariables()
{
SetEnv("REQUEST_METHOD", cur.request->env_request_method);
SetEnv("REQUEST_URI", cur.request->env_request_uri);
SetEnv("HTTP_COOKIE", cur.request->env_http_cookie);
SetEnv("REMOTE_ADDR", cur.request->env_remote_addr);
SetEnv("HTTP_HOST", cur.request->env_http_host);
SetEnv("HTTP_USER_AGENT", cur.request->env_http_user_agent);
SetEnv("FCGI_ROLE", cur.request->env_fcgi_role);
SetEnv("CONTENT_TYPE", cur.request->env_content_type);
SetEnv("HTTP_ACCEPT_ENCODING", cur.request->env_http_accept_encoding);
SetEnv("HTTPS", cur.request->env_https);
SetEnv("HTTP_HOST", cur.request->env_http_host);
SetEnv("HTTP_USER_AGENT", cur.request->env_http_user_agent);
SetEnv("HTTP_COOKIE", cur.request->env_http_cookie);
SetEnv("HTTP_ACCEPT_ENCODING", cur.request->env_http_accept_encoding);
}
// reading from fastcgi env
void App::ReadEnvHTTPVariables()
{
const char http_prefix[] = "HTTP_";
size_t http_prefix_len = sizeof(http_prefix) / sizeof(char) - 1; // 1 means terminating null character
size_t http_headers_saved = 0;
for(char ** e = fcgi_request.envp ; *e && http_headers_saved < Request::MAX_INPUT_HEADERS ; ++e)
{
char * env = *e;
if( IsSubStringNoCasep("HTTP_", env) )
{
env += http_prefix_len;
// cookies we have in a different table
if( !IsSubStringNoCasep("COOKIE=", env) )
{
if( SaveEnvHTTPVariable(env) )
{
http_headers_saved += 1;
}
}
}
}
if( http_headers_saved == Request::MAX_INPUT_HEADERS )
{
log << log4 << "App: the maximum number of HTTP headers has been reached, skipping the rest" << logend;
}
}
/*
* headers in fcgi are in the form of name=value
*/
bool App::SaveEnvHTTPVariable(const char * env)
{
// CHECK ME may move to a better place? Request::INPUT_HEADER_VALUE_MAX_LENGTH is a high value
char header_name[Request::INPUT_HEADER_NAME_MAX_LENGTH + 1];
char header_value[Request::INPUT_HEADER_VALUE_MAX_LENGTH + 1];
size_t i = 0;
for( ; env[i] != 0 && env[i] != '=' && i < Request::INPUT_HEADER_NAME_MAX_LENGTH ; ++i)
{
header_name[i] = ToSmall(env[i]);
}
header_name[i] = 0;
if( env[i] != '=' )
{
// too long header name, skipping
log << log4 << "App: skipped HTTP header \"" << env << "\" because the header name is too long" << logend;
return false;
}
i += 1; // skipping '=' character
size_t h = 0;
for( ; env[i] != 0 && h < Request::INPUT_HEADER_VALUE_MAX_LENGTH ; ++i, ++h)
{
header_value[h] = env[i];
}
header_value[h] = 0;
if( env[i] != 0 )
{
// too long header value, skipping
log << log4 << "App: skipped HTTP header \"" << env << "\" because the header value is too long" << logend;
return false;
}
PT::UTF8ToWide(header_name, http_header);
std::wstring & inserted_header = cur.request->headers_in.Add(http_header, L"", true);
PT::UTF8ToWide(header_value, inserted_header);
http_header.clear();
return true;
}
void App::ReadEnvRemoteIP()
{
@@ -798,6 +903,9 @@ void App::CheckRequestMethod()
else
if( ToSmall(cur.request->env_request_method[0]) == 'h' )
cur.request->method = Request::head;
else
if( ToSmall(cur.request->env_request_method[0]) == 'd' )
cur.request->method = Request::delete_;
}
}