From fa05e25a9d6f20a39565d0c2f6aec5f56c29591f Mon Sep 17 00:00:00 2001 From: Tomasz Sowa Date: Sat, 17 Dec 2011 21:59:22 +0000 Subject: [PATCH] added: to config: 'content_type_header' parameter the kind of "Content-Type" header send to the client if utf8 is enabled then 'charset=UTF-8' will also be appended added: to templates: an index pattern for 'rawcontent' used when 'rawcontent' parameter is present by default the template has only one [content] ezc function useful in AJAX requests git-svn-id: svn://ttmath.org/publicrep/winix/trunk@784 e52654a7-88a9-db11-a3e9-0013d4bc506e --- core/app.cpp | 29 ++++++++++++++++-- core/app.h | 1 + core/config.cpp | 5 ++++ core/config.h | 9 ++++-- templates/templates.cpp | 66 ++++++++++++++++++++++++++++++----------- templates/templates.h | 4 +++ 6 files changed, 92 insertions(+), 22 deletions(-) diff --git a/core/app.cpp b/core/app.cpp index 5303e65..a35041b 100755 --- a/core/app.cpp +++ b/core/app.cpp @@ -667,12 +667,35 @@ void App::SendHeadersStatic() } +void App::SendHeaderContentType() +{ + switch( config.content_type_header ) + { + case 1: + FCGX_PutS("Content-Type: application/xhtml+xml", fcgi_request.out); + break; + + case 2: + FCGX_PutS("Content-Type: application/xml", fcgi_request.out); + break; + + case 0: + default: + FCGX_PutS("Content-Type: text/html", fcgi_request.out); + } + + if( config.utf8 ) + FCGX_PutS("; charset=UTF-8", fcgi_request.out); + + FCGX_PutS("\r\n", fcgi_request.out); +} + void App::SendHeadersForbidden() { FCGX_PutS("Status: 403 Forbidden\r\n", fcgi_request.out); - FCGX_PutS("Content-Type: text/html\r\n", fcgi_request.out); + SendHeaderContentType(); log << log2 << "App: response: 403 Forbidden" << logend; } @@ -739,7 +762,7 @@ void App::SendHeadersNormal(Header header) { case h_404: FCGX_PutS("Status: 404 Not Found\r\n", fcgi_request.out); - FCGX_PutS("Content-Type: text/html\r\n", fcgi_request.out); + SendHeaderContentType(); log << log2 << "App: response: 404 Not Found" << logend; break; @@ -751,7 +774,7 @@ void App::SendHeadersNormal(Header header) FCGX_PutS("Status: 200 OK\r\n", fcgi_request.out); if( cur.request->role != Request::authorizer ) - FCGX_PutS("Content-Type: text/html\r\n", fcgi_request.out); + SendHeaderContentType(); } } diff --git a/core/app.h b/core/app.h index 12a32fa..7cbdc02 100755 --- a/core/app.h +++ b/core/app.h @@ -152,6 +152,7 @@ private: void FilterCompressSend(bool compressing, int compress_encoding, const std::wstring & source_ref); bool SendHeadersStaticCreateResource(); void SendHeadersStatic(); + void SendHeaderContentType(); void SendHeadersForbidden(); void SendHeadersRedirect(); void SendHeadersSendFile(); diff --git a/core/config.cpp b/core/config.cpp index b91fc63..aff5b4e 100755 --- a/core/config.cpp +++ b/core/config.cpp @@ -227,6 +227,8 @@ void Config::AssignValues(bool stdout_is_closed) pattern_cacher_when_delete = Size(L"pattern_cacher_when_delete", 130); pattern_cacher_how_many_delete = Size(L"pattern_cacher_how_many_delete", 30); + + content_type_header = Int(L"content_type_header", 0); } @@ -245,6 +247,9 @@ void Config::SetAdditionalVariables() CheckLocale(); CheckPasswd(); + + if( content_type_header < 0 || content_type_header > 2 ) + content_type_header = 0; } diff --git a/core/config.h b/core/config.h index 953b896..266fd5c 100755 --- a/core/config.h +++ b/core/config.h @@ -445,8 +445,13 @@ public: size_t pattern_cacher_when_delete; size_t pattern_cacher_how_many_delete; - - + // header "Content-Type" send to the client + // 0 - text/html - for HTML + // 1 - application/xhtml+xml - for XHTML 1.0 + // 2 - application/xml - for XHTML 1.0 or for XHTML 1.1 + // default: 0 + // if utf8 is true then "; charset=UTF-8" will also be appended + int content_type_header; diff --git a/templates/templates.cpp b/templates/templates.cpp index 9bad50c..25ac32d 100755 --- a/templates/templates.cpp +++ b/templates/templates.cpp @@ -19,7 +19,8 @@ namespace TemplatesFunctions { size_t pat_index; // main index pattern -size_t pat_index_fullscreen; // an empty pattern (without menus etc., used for ckeditor images browser) +size_t pat_index_fullscreen; // an empty pattern (without menus etc. but with all rest html tags, used for ckeditor images browser) +size_t pat_index_rawcontent; // completly empty pattern (only content, without html tags such as , ) size_t pat_err_404; // 404 error size_t pat_err_per_denied; // permission denied error @@ -695,6 +696,7 @@ using namespace TemplatesFunctions; pat_index = patterns.Add(config->templates_index); pat_index_fullscreen = patterns.Add(L"index_fullscreen.html"); + pat_index_rawcontent = patterns.Add(L"index_rawcontent.html"); pat_err_404 = patterns.Add(L"err_404.html"); pat_err_per_denied = patterns.Add(L"err_per_denied.html"); @@ -741,34 +743,53 @@ using namespace TemplatesFunctions; } -void Templates::Generate() + +// can return a null pointer +Ezc::Pattern * Templates::SelectIndexPatternFromItemAndMountPoint() { using namespace TemplatesFunctions; Ezc::Pattern * index = 0; const std::wstring * index_file_local = 0; - if( cur->request->IsParam(L"fullscreen") ) + // first we try to get an index template from 'template' item parameter (template winix function) + // if such a parameter is not defined then we try to get an index from the mount point + if( !cur->request->last_item->html_template.empty() ) { - index = patterns.Get(pat_index_fullscreen, locale.GetLang()); + index_file_local = &cur->request->last_item->html_template; } else { - if( !cur->request->last_item->html_template.empty() ) - index_file_local = &cur->request->last_item->html_template; + Mounts & mounts = TemplatesFunctions::system->mounts; + const std::wstring & temp = cur->mount->FirstArg(mounts.MountParHtmlTemplate()); - if( !index_file_local ) - { - Mounts & mounts = TemplatesFunctions::system->mounts; - const std::wstring & temp = cur->mount->FirstArg(mounts.MountParHtmlTemplate()); - - if( !temp.empty() ) - index_file_local = &temp; - } - - if( index_file_local && *index_file_local != config->templates_index ) - index = index_patterns.Get(*index_file_local, locale.GetLang()); + if( !temp.empty() ) + index_file_local = &temp; } + + if( index_file_local && *index_file_local != config->templates_index ) + index = index_patterns.Get(*index_file_local, locale.GetLang()); + +return index; +} + + + + +// can return a null pointer +Ezc::Pattern * Templates::SelectIndexPattern() +{ +using namespace TemplatesFunctions; + + Ezc::Pattern * index = 0; + + if( cur->request->IsParam(L"rawcontent") ) + index = patterns.Get(pat_index_rawcontent, locale.GetLang()); + else + if( cur->request->IsParam(L"fullscreen") ) + index = patterns.Get(pat_index_fullscreen, locale.GetLang()); + else + index = SelectIndexPatternFromItemAndMountPoint(); if( !index ) index = change_patterns.Get(cur->mount->dir_id, config->templates_index, locale.GetLang()); @@ -776,6 +797,17 @@ using namespace TemplatesFunctions; if( !index ) index = patterns.Get(pat_index, locale.GetLang());; +return index; +} + + + +void Templates::Generate() +{ +using namespace TemplatesFunctions; + + Ezc::Pattern * index = SelectIndexPattern(); + if( index ) generator.Generate(cur->request->page, *index); else diff --git a/templates/templates.h b/templates/templates.h index 7c5fb3f..138c730 100755 --- a/templates/templates.h +++ b/templates/templates.h @@ -37,6 +37,8 @@ class Functions; namespace TemplatesFunctions { extern size_t pat_index; + extern size_t pat_index_fullscreen; + extern size_t pat_index_rawcontent; extern size_t pat_err_404; extern size_t pat_err_per_denied; @@ -485,6 +487,8 @@ private: void ReadLocale(); void SetHtmlFilter(); void CreateFunctions(); // should be called before reading patterns (patterns will cache ezc functions) + Ezc::Pattern * SelectIndexPatternFromItemAndMountPoint(); + Ezc::Pattern * SelectIndexPattern(); TemplatesFunctions::EzcGen generator; std::wstring temp;