removed: ezn patterns for rawcontent and ajaxcontent:
index_rawcontent.html, index_ajaxcontent.html now we have out_streams in Request and some special keyword in ezc templates for sending content to the specified streams changed: the way how winix answers to the client's browsers: info from Request class: winix answer send to the client's browser | | depending on send_bin_stream ------------------------------------------------- | | text answer binary answer | | depending on return_json sending out_bin_stream ------------------------------------ | | normal request ajax request | | sending out_streams[0] depending on return_info_only ------------------------------------------------------ | | generating JSON object from: generating JSON object only from info out_streams and info, e.g.: e.g.: { { info object serialized here } "stream_1": "some html content", "stream_2": "some other html content", "info": { info object serialized here } } note that out_streams[0] is not sent in JSON answers git-svn-id: svn://ttmath.org/publicrep/winix/trunk@937 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
parent
d801f53154
commit
3af3ac3f6f
90
core/app.cpp
90
core/app.cpp
|
@ -317,6 +317,7 @@ void App::ProcessRequestThrow()
|
||||||
|
|
||||||
plugin.Call(WINIX_SESSION_CHANGED);
|
plugin.Call(WINIX_SESSION_CHANGED);
|
||||||
functions.Parse(); // parsing directories,files,functions and parameters
|
functions.Parse(); // parsing directories,files,functions and parameters
|
||||||
|
|
||||||
cur.mount = system.mounts.CalcCurMount();
|
cur.mount = system.mounts.CalcCurMount();
|
||||||
|
|
||||||
if( cur.mount->type != system.mounts.MountTypeStatic() )
|
if( cur.mount->type != system.mounts.MountTypeStatic() )
|
||||||
|
@ -400,13 +401,51 @@ void App::SaveSessionsIfNeeded()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void App::CreateJSONAnswer()
|
||||||
|
{
|
||||||
|
Request & req = *cur.request;
|
||||||
|
json_out_stream.Clear();
|
||||||
|
|
||||||
|
if( !req.return_info_only )
|
||||||
|
{
|
||||||
|
json_out_stream << L"{\n";
|
||||||
|
|
||||||
|
for(size_t i=1 ; i<req.out_streams.size() ; ++i)
|
||||||
|
{
|
||||||
|
json_out_stream << L"\"stream_" << i << L"\": \"";
|
||||||
|
JSONescape(json_out_stream, req.out_streams[i].Str());
|
||||||
|
json_out_stream << L"\",\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
json_out_stream << L"\"info\": ";
|
||||||
|
}
|
||||||
|
|
||||||
|
if( req.info_serializer )
|
||||||
|
{
|
||||||
|
req.info_serializer->Serialize(req.info, json_out_stream, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
json_out_stream << L"{}";
|
||||||
|
log << log1 << "App: Request::info_serializer not defined" << logend;
|
||||||
|
}
|
||||||
|
|
||||||
|
log << log3 << "App: sending JSON answer";
|
||||||
|
|
||||||
|
if( !req.return_info_only )
|
||||||
|
json_out_stream << L"}\n";
|
||||||
|
else
|
||||||
|
log << " (Request::info only)";
|
||||||
|
|
||||||
|
log << logend;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// !! zmienic na lepsza nazwe
|
// !! zmienic na lepsza nazwe
|
||||||
void App::MakePage()
|
void App::MakePage()
|
||||||
{
|
{
|
||||||
bool sent = false;
|
bool sent = false;
|
||||||
|
|
||||||
|
|
||||||
if( cur.request->page_generated || !cur.request->redirect_to.empty() || !cur.request->x_sendfile.empty() )
|
if( cur.request->page_generated || !cur.request->redirect_to.empty() || !cur.request->x_sendfile.empty() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -419,7 +458,7 @@ bool sent = false;
|
||||||
{
|
{
|
||||||
if( cur.request->function == &functions.fun_cat )
|
if( cur.request->function == &functions.fun_cat )
|
||||||
{
|
{
|
||||||
cur.request->page << cur.request->item.content;
|
cur.request->out_streams[0] << cur.request->item.content; // !! CHECK ME is it ok?
|
||||||
sent = true;
|
sent = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -436,12 +475,9 @@ bool sent = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if( cur.request->ajax_serializer )
|
if( cur.request->return_json )
|
||||||
{
|
{
|
||||||
log << log3 << "App: sending JSON" << logend;
|
CreateJSONAnswer();
|
||||||
std::wstring & ajax_content = cur.request->ajax.Add(L"content", L"");
|
|
||||||
ajax_content = cur.request->page.Str();
|
|
||||||
cur.request->ajax_serializer->Serialize(cur.request->ajax, cur.request->ajaxpage, true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -476,6 +512,9 @@ void App::Make()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( cur.request->ParamValue(L"reqtype") == L"json" )
|
||||||
|
cur.request->return_json = true;
|
||||||
|
|
||||||
if( cur.session->ip_ban && cur.session->ip_ban->IsIPBanned() )
|
if( cur.session->ip_ban && cur.session->ip_ban->IsIPBanned() )
|
||||||
{
|
{
|
||||||
PT::Date date(cur.session->ip_ban->expires);
|
PT::Date date(cur.session->ip_ban->expires);
|
||||||
|
@ -525,11 +564,10 @@ void App::Make()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !cur.request->ajax_serializer && cur.request->ParamValue(L"reqtype") == L"json")
|
if( !cur.request->info_serializer )
|
||||||
{
|
{
|
||||||
log << log3 << "App: using generic JSON serializer" << logend;
|
json_generic_serializer.Clear(); // !! IMPROVE ME add to the end of a request
|
||||||
ajax_generic_serializer.Clear();
|
cur.request->info_serializer = &json_generic_serializer;
|
||||||
cur.request->ajax_serializer = &ajax_generic_serializer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
plugin.Call(WINIX_CONTENT_MAKE);
|
plugin.Call(WINIX_CONTENT_MAKE);
|
||||||
|
@ -728,6 +766,7 @@ void App::CheckKonqueror()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void App::PrepareSessionCookie()
|
void App::PrepareSessionCookie()
|
||||||
{
|
{
|
||||||
if( !cur.session || cur.session->id==0 )
|
if( !cur.session || cur.session->id==0 )
|
||||||
|
@ -812,7 +851,7 @@ void App::SendHeadersStatic()
|
||||||
|
|
||||||
void App::SendHeaderContentType()
|
void App::SendHeaderContentType()
|
||||||
{
|
{
|
||||||
if( cur.request->ajax_serializer )
|
if( cur.request->return_json )
|
||||||
{
|
{
|
||||||
FCGX_PutS("Content-Type: application/json", fcgi_request.out);
|
FCGX_PutS("Content-Type: application/json", fcgi_request.out);
|
||||||
}
|
}
|
||||||
|
@ -967,7 +1006,7 @@ void App::FilterCompressSend(bool compressing, int compress_encoding, const std:
|
||||||
bool raw = cur.request->is_item && cur.request->item.content_type == Item::ct_raw && cur.request->status == WINIX_ERR_OK &&
|
bool raw = cur.request->is_item && cur.request->item.content_type == Item::ct_raw && cur.request->status == WINIX_ERR_OK &&
|
||||||
cur.request->function && (cur.request->function == &functions.fun_cat || cur.request->function == &functions.fun_run);
|
cur.request->function && (cur.request->function == &functions.fun_cat || cur.request->function == &functions.fun_run);
|
||||||
|
|
||||||
if( config.html_filter && cur.request->use_html_filter && !raw && !cur.request->ajax_serializer )
|
if( config.html_filter && cur.request->use_html_filter && !raw && !cur.request->return_json )
|
||||||
{
|
{
|
||||||
TemplatesFunctions::html_filter.Filter(*source, clean_html);
|
TemplatesFunctions::html_filter.Filter(*source, clean_html);
|
||||||
AddDebugInfo(clean_html);
|
AddDebugInfo(clean_html);
|
||||||
|
@ -992,6 +1031,9 @@ void App::FilterCompressSend(bool compressing, int compress_encoding, const std:
|
||||||
compress.CompressAndPut(source_a.c_str(), source_a.length(), fcgi_request.out, compress_encoding);
|
compress.CompressAndPut(source_a.c_str(), source_a.length(), fcgi_request.out, compress_encoding);
|
||||||
else
|
else
|
||||||
FCGX_PutS(source_a.c_str(), fcgi_request.out);
|
FCGX_PutS(source_a.c_str(), fcgi_request.out);
|
||||||
|
|
||||||
|
if( cur.request->return_json )
|
||||||
|
json_out_stream.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1098,10 +1140,10 @@ Error status = cur.request->status;
|
||||||
bool compressing;
|
bool compressing;
|
||||||
int compress_encoding;
|
int compress_encoding;
|
||||||
|
|
||||||
if( cur.request->ajax_serializer )
|
if( cur.request->return_json )
|
||||||
source = &cur.request->ajaxpage.Str();
|
source = &json_out_stream.Str();
|
||||||
else
|
else
|
||||||
source = &cur.request->page.Str();
|
source = &cur.request->out_streams[0].Str();
|
||||||
|
|
||||||
SelectCompression(source->length(), compressing, compress_encoding);
|
SelectCompression(source->length(), compressing, compress_encoding);
|
||||||
|
|
||||||
|
@ -1158,14 +1200,12 @@ void App::SendData(const BinaryPage & page, FCGX_Stream * out)
|
||||||
|
|
||||||
void App::SendBinaryAnswer()
|
void App::SendBinaryAnswer()
|
||||||
{
|
{
|
||||||
BinaryPage & source = cur.request->binary_page;
|
BinaryPage & source = cur.request->out_bin_stream;
|
||||||
BinaryPage & compressed_page = cur.request->compressed_page;
|
|
||||||
Header header = h_200;
|
Header header = h_200;
|
||||||
Error status = cur.request->status;
|
Error status = cur.request->status;
|
||||||
bool compressing;
|
bool compressing;
|
||||||
int compress_encoding;
|
int compress_encoding;
|
||||||
|
|
||||||
|
|
||||||
SelectCompression(source.size(), compressing, compress_encoding);
|
SelectCompression(source.size(), compressing, compress_encoding);
|
||||||
|
|
||||||
if( status == WINIX_ERR_NO_ITEM || status == WINIX_ERR_NO_FUNCTION || status == WINIX_ERR_UNKNOWN_PARAM )
|
if( status == WINIX_ERR_NO_ITEM || status == WINIX_ERR_NO_FUNCTION || status == WINIX_ERR_UNKNOWN_PARAM )
|
||||||
|
@ -1182,8 +1222,10 @@ int compress_encoding;
|
||||||
{
|
{
|
||||||
if( compressing )
|
if( compressing )
|
||||||
{
|
{
|
||||||
compress.Compressing(source, compressed_page, compress_encoding);
|
out_bin_stream_compressed.clear(); // !! IMPROVE ME add to the end of a request
|
||||||
SendData(compressed_page, fcgi_request.out);
|
compress.Compressing(source, out_bin_stream_compressed, compress_encoding);
|
||||||
|
SendData(out_bin_stream_compressed, fcgi_request.out);
|
||||||
|
out_bin_stream_compressed.clear();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1195,10 +1237,10 @@ int compress_encoding;
|
||||||
|
|
||||||
void App::SendAnswer()
|
void App::SendAnswer()
|
||||||
{
|
{
|
||||||
if( cur.request->use_text_page )
|
if( cur.request->send_bin_stream )
|
||||||
SendTextAnswer();
|
|
||||||
else
|
|
||||||
SendBinaryAnswer();
|
SendBinaryAnswer();
|
||||||
|
else
|
||||||
|
SendTextAnswer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -122,7 +122,9 @@ private:
|
||||||
std::string sendh_t, sendh_t2, sendh_t3;
|
std::string sendh_t, sendh_t2, sendh_t3;
|
||||||
std::string sendfilea, sendfile2a;
|
std::string sendfilea, sendfile2a;
|
||||||
std::string send_data_buf;
|
std::string send_data_buf;
|
||||||
PT::SpaceToJSON ajax_generic_serializer;
|
PT::SpaceToJSON json_generic_serializer;
|
||||||
|
TextStream<std::wstring> json_out_stream;
|
||||||
|
BinaryPage out_bin_stream_compressed;
|
||||||
|
|
||||||
bool CheckAccessFromPlugins();
|
bool CheckAccessFromPlugins();
|
||||||
void ProcessRequestThrow();
|
void ProcessRequestThrow();
|
||||||
|
@ -137,6 +139,7 @@ private:
|
||||||
void SaveSessionsIfNeeded(); // !! wywalic do menagera sesji??
|
void SaveSessionsIfNeeded(); // !! wywalic do menagera sesji??
|
||||||
void LogAccess();
|
void LogAccess();
|
||||||
void SendData(const BinaryPage & page, FCGX_Stream * out);
|
void SendData(const BinaryPage & page, FCGX_Stream * out);
|
||||||
|
void CreateJSONAnswer();
|
||||||
|
|
||||||
void ReadRequest();
|
void ReadRequest();
|
||||||
void SendTextAnswer();
|
void SendTextAnswer();
|
||||||
|
@ -156,6 +159,7 @@ private:
|
||||||
void CheckSSL();
|
void CheckSSL();
|
||||||
void SetSubdomain();
|
void SetSubdomain();
|
||||||
|
|
||||||
|
|
||||||
void PrepareSessionCookie();
|
void PrepareSessionCookie();
|
||||||
void AddDebugInfo(std::wstring & out);
|
void AddDebugInfo(std::wstring & out);
|
||||||
void FilterCompressSend(bool compressing, int compress_encoding, const std::wstring & source_ref);
|
void FilterCompressSend(bool compressing, int compress_encoding, const std::wstring & source_ref);
|
||||||
|
|
30
core/misc.h
30
core/misc.h
|
@ -1014,4 +1014,34 @@ void SetMinMax(IntType & val, IntType min_val, IntType max_val)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template<class Stream, class StringType>
|
||||||
|
void JSONescape(Stream & out, const StringType & str)
|
||||||
|
{
|
||||||
|
// !! IMPROVE ME (optimizing)
|
||||||
|
// it is better to not write one by one character
|
||||||
|
// but use write method insted
|
||||||
|
|
||||||
|
for(size_t i=0 ; i<str.size() ; ++i)
|
||||||
|
{
|
||||||
|
switch(str[i])
|
||||||
|
{
|
||||||
|
case 0: out << '\\'; out << '0'; break;
|
||||||
|
case '\r': out << '\\'; out << 'r'; break;
|
||||||
|
case '\n': out << '\\'; out << 'n'; break;
|
||||||
|
case '\t': out << '\\'; out << 't'; break;
|
||||||
|
case 0x08: out << '\\'; out << 'b'; break;
|
||||||
|
case 0x0c: out << '\\'; out << 'f'; break;
|
||||||
|
case '\\': out << '\\'; out << '\\'; break;
|
||||||
|
//case '/': out << '\\'; out << '/'; break; // slash doesn't have to be escaped
|
||||||
|
case '"': out << '\\'; out << '\"'; break;
|
||||||
|
default:
|
||||||
|
out << str[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -30,34 +30,15 @@ void Request::SetConfig(Config * pconfig)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Request::ClearAjax()
|
|
||||||
|
|
||||||
|
void Request::ClearOutputStreams()
|
||||||
{
|
{
|
||||||
size_t i = ajax.spaces.size();
|
out_streams.resize(16); // !! IMPROVE ME add as a constant somewhere
|
||||||
|
|
||||||
while( i-- > 0 )
|
for(size_t i=0 ; i<out_streams.size() ; ++i)
|
||||||
ajax.RemoveSpace(i);
|
out_streams[i].Clear();
|
||||||
|
|
||||||
ajax.table.clear();
|
|
||||||
|
|
||||||
PT::Space::TableSingle::iterator s = ajax.table_single.begin();
|
|
||||||
|
|
||||||
while( s != ajax.table_single.end() )
|
|
||||||
{
|
|
||||||
if( s->first != L"content" && s->first != L"http_status" )
|
|
||||||
{
|
|
||||||
ajax.table_single.erase(s++);
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
// small optimization when deleting
|
|
||||||
// the memory for "content" and "http_status" will be reused
|
|
||||||
s->second.clear();
|
|
||||||
|
|
||||||
++s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Request::Clear()
|
void Request::Clear()
|
||||||
|
@ -67,6 +48,7 @@ void Request::Clear()
|
||||||
++id;
|
++id;
|
||||||
|
|
||||||
RemovePostFileTmp(post_file_tab);
|
RemovePostFileTmp(post_file_tab);
|
||||||
|
ClearOutputStreams();
|
||||||
|
|
||||||
post_tab.clear();
|
post_tab.clear();
|
||||||
post_file_tab.clear();
|
post_file_tab.clear();
|
||||||
|
@ -76,8 +58,8 @@ void Request::Clear()
|
||||||
role = responder;
|
role = responder;
|
||||||
|
|
||||||
headers.Clear();
|
headers.Clear();
|
||||||
page.Clear();
|
|
||||||
ajaxpage.Clear();
|
|
||||||
debug.Clear();
|
debug.Clear();
|
||||||
|
|
||||||
page_generated = false;
|
page_generated = false;
|
||||||
|
@ -117,12 +99,13 @@ void Request::Clear()
|
||||||
start_date.Clear();
|
start_date.Clear();
|
||||||
|
|
||||||
subdomain.clear();
|
subdomain.clear();
|
||||||
ClearAjax();
|
return_info_only = false;
|
||||||
ajax_serializer = 0;
|
info.Clear();
|
||||||
|
info_serializer = 0;
|
||||||
|
return_json = false;
|
||||||
|
|
||||||
binary_page.clear();
|
out_bin_stream.clear();
|
||||||
compressed_page.clear();
|
send_bin_stream = false;
|
||||||
use_text_page = true;
|
|
||||||
|
|
||||||
gen_trim_white = false;
|
gen_trim_white = false;
|
||||||
gen_skip_new_line = false;
|
gen_skip_new_line = false;
|
||||||
|
|
115
core/request.h
115
core/request.h
|
@ -44,20 +44,100 @@ struct Request
|
||||||
|
|
||||||
// headers, page and debug
|
// headers, page and debug
|
||||||
//std::ostringstream headers, page, debug;
|
//std::ostringstream headers, page, debug;
|
||||||
|
// !! IMPROVE ME change headers to some kind of a map, may PT::Space ?
|
||||||
TextStream<std::string> headers;
|
TextStream<std::string> headers;
|
||||||
HtmlTextStream page, debug;
|
HtmlTextStream debug;
|
||||||
TextStream<std::wstring> ajaxpage;
|
|
||||||
|
|
||||||
// binary page
|
|
||||||
BinaryPage binary_page;
|
|
||||||
|
|
||||||
// a compressed page ready to send to the client
|
// winix can return either a text answer or a binary answer
|
||||||
BinaryPage compressed_page;
|
// if send_bin_stream is true then the binary answer is sent (out_bin_stream)
|
||||||
|
// or if send_bin_stream is false then the text answer is sent
|
||||||
|
// default: false
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// winix answer send to the client's browser
|
||||||
|
// |
|
||||||
|
// |
|
||||||
|
// depending on send_bin_stream
|
||||||
|
// -------------------------------------------------
|
||||||
|
// | |
|
||||||
|
// text answer binary answer
|
||||||
|
// | |
|
||||||
|
// depending on return_json sending out_bin_stream
|
||||||
|
// ------------------------------------
|
||||||
|
// | |
|
||||||
|
// normal request ajax request
|
||||||
|
// | |
|
||||||
|
// sending out_streams[0] depending on return_info_only
|
||||||
|
// ------------------------------------------------------
|
||||||
|
// | |
|
||||||
|
// generating JSON object from: generating JSON object only from info
|
||||||
|
// out_streams and info, e.g.: e.g.:
|
||||||
|
// { { info object serialized here }
|
||||||
|
// "stream_1": "some html content",
|
||||||
|
// "stream_2": "some other html content",
|
||||||
|
// "info": { info object serialized here }
|
||||||
|
// }
|
||||||
|
// note that out_streams[0] is not sent
|
||||||
|
// in JSON answers
|
||||||
|
//
|
||||||
|
//
|
||||||
|
bool send_bin_stream;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
// binary answer
|
||||||
|
//
|
||||||
|
|
||||||
|
// binary page sent to the client if send_bin_stream is true
|
||||||
|
BinaryPage out_bin_stream;
|
||||||
|
|
||||||
|
//
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
// text answer
|
||||||
|
//
|
||||||
|
|
||||||
|
// when returning the text answer we can either return the whole html page (normal requests)
|
||||||
|
// or a JSON object (for requests generated from AJAX)
|
||||||
|
// if return_json is false then we return the whole html page (which is in out_streams[0])
|
||||||
|
// if return_json is true we are creating an JSON object from out_streams
|
||||||
|
// (zero stream is ignored) and from info space (see above picture)
|
||||||
|
// (or just only from info if return_info_only is true)
|
||||||
|
// default: false
|
||||||
|
// return_json is set to true by App at the beginning of a request
|
||||||
|
// if reqtype:json parameter is present (in the url)
|
||||||
|
// note: return_json is only valid if send_bin_stream is false
|
||||||
|
bool return_json;
|
||||||
|
|
||||||
|
// main text output streams where the html otput is generated from ezc templates
|
||||||
|
// the zero stream (out_streams[0]) is used as the main stream
|
||||||
|
// to which the whole html page (with doctype, head, body) is generated
|
||||||
|
// the rest streams can be only used in ajax requests (send in JSON format to the client)
|
||||||
|
// in ezc templates you can use [ezc stream ...] keyword
|
||||||
|
// to switch between streams e.g. [ezc stream "0" "2"]
|
||||||
|
std::vector<HtmlTextStream> out_streams;
|
||||||
|
|
||||||
|
// if true the JSON object is generated only from info (out_streams are not used)
|
||||||
|
// default: false
|
||||||
|
bool return_info_only;
|
||||||
|
|
||||||
|
// additional info added when sending the JSON answer
|
||||||
|
PT::Space info;
|
||||||
|
|
||||||
|
// info serializer
|
||||||
|
// if not set then the json_generic_serializer from App will be used
|
||||||
|
// default: null (json_generic_serializer used)
|
||||||
|
PT::SpaceToJSON * info_serializer;
|
||||||
|
|
||||||
|
//
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
|
||||||
// if true then either page or ajaxpage will be sent to the client
|
|
||||||
// if false then binary_page is sent
|
|
||||||
// default: true
|
|
||||||
bool use_text_page;
|
|
||||||
|
|
||||||
// if set to true then the standard template system will not be generated
|
// if set to true then the standard template system will not be generated
|
||||||
// default: false
|
// default: false
|
||||||
|
@ -67,6 +147,10 @@ struct Request
|
||||||
// default: true
|
// default: true
|
||||||
bool use_html_filter;
|
bool use_html_filter;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// raw parameters
|
// raw parameters
|
||||||
PostTab post_tab;
|
PostTab post_tab;
|
||||||
PostFileTab post_file_tab;
|
PostFileTab post_file_tab;
|
||||||
|
@ -157,15 +241,6 @@ struct Request
|
||||||
// subdomain = HTTP_HOST environment variable - config->base_url
|
// subdomain = HTTP_HOST environment variable - config->base_url
|
||||||
std::wstring subdomain;
|
std::wstring subdomain;
|
||||||
|
|
||||||
// used as a JSON output (when ajax_serializer is defined)
|
|
||||||
// it will be serialized and have at least:
|
|
||||||
// 'content' string - the whole html content
|
|
||||||
// 'http_status' integer - http status code (e.g. 200) !! FIXME this is not added at the moment
|
|
||||||
PT::Space ajax;
|
|
||||||
|
|
||||||
// if not null then the request will have a JSON as an output
|
|
||||||
PT::SpaceToJSON * ajax_serializer;
|
|
||||||
|
|
||||||
// if this variable is true then winix always return 200 OK header
|
// if this variable is true then winix always return 200 OK header
|
||||||
// when the status would be 404 (not found) or 403 (permission denied)
|
// when the status would be 404 (not found) or 403 (permission denied)
|
||||||
// default: false
|
// default: false
|
||||||
|
@ -222,7 +297,7 @@ private:
|
||||||
// used in ParamValue() and PostVar() when there is no such a param
|
// used in ParamValue() and PostVar() when there is no such a param
|
||||||
const std::wstring str_empty;
|
const std::wstring str_empty;
|
||||||
|
|
||||||
void ClearAjax();
|
void ClearOutputStreams();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* This file is a part of Winix
|
* This file is a part of Winix
|
||||||
* and is not publicly distributed
|
* and is not publicly distributed
|
||||||
*
|
*
|
||||||
* Copyright (c) 2010-2012, Tomasz Sowa
|
* Copyright (c) 2010-2013, Tomasz Sowa
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@ -144,6 +144,30 @@ bool ssl = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void System::CreateItemLink(long parent_id, const std::wstring & url, const std::wstring & subdomain,
|
||||||
|
std::wstring & link, bool clear_str)
|
||||||
|
{
|
||||||
|
PutUrlProto(config->use_ssl, link, clear_str);
|
||||||
|
|
||||||
|
if( !subdomain.empty() )
|
||||||
|
{
|
||||||
|
link += subdomain;
|
||||||
|
link += '.';
|
||||||
|
}
|
||||||
|
|
||||||
|
link += config->base_url;
|
||||||
|
dirs.MakePath(parent_id, link, false); // !! IMPROVE ME may some kind of error checks here?
|
||||||
|
link += url;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void System::CreateItemLink(const Item & item, std::wstring & link, bool clear_str)
|
||||||
|
{
|
||||||
|
CreateItemLink(item.parent_id, item.url, cur->request->subdomain, link, clear_str);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// !! IMPROVE ME
|
// !! IMPROVE ME
|
||||||
// !! mozna zrobic jakas obsluge kiedy nie mozemy sie redirectnac, np gdy wystapil blad
|
// !! mozna zrobic jakas obsluge kiedy nie mozemy sie redirectnac, np gdy wystapil blad
|
||||||
// !! moze zwracac jakas wartosc?
|
// !! moze zwracac jakas wartosc?
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* This file is a part of Winix
|
* This file is a part of Winix
|
||||||
* and is not publicly distributed
|
* and is not publicly distributed
|
||||||
*
|
*
|
||||||
* Copyright (c) 2010-2012, Tomasz Sowa
|
* Copyright (c) 2010-2013, Tomasz Sowa
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@ -171,6 +171,13 @@ public:
|
||||||
// reloading time zones
|
// reloading time zones
|
||||||
void ReadTimeZones();
|
void ReadTimeZones();
|
||||||
|
|
||||||
|
|
||||||
|
void CreateItemLink(long parent_id, const std::wstring & url, const std::wstring & subdomain,
|
||||||
|
std::wstring & link, bool clear_str = true);
|
||||||
|
|
||||||
|
void CreateItemLink(const Item & item, std::wstring & link, bool clear_str = true);
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
Cur * cur;
|
Cur * cur;
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
|
|
||||||
#define WINIX_VER_MAJOR 0
|
#define WINIX_VER_MAJOR 0
|
||||||
#define WINIX_VER_MINOR 5
|
#define WINIX_VER_MINOR 5
|
||||||
#define WINIX_VER_REVISION 5
|
#define WINIX_VER_REVISION 6
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -464,9 +464,9 @@ void Rm::Clear()
|
||||||
void Rm::CreateJSON(bool status)
|
void Rm::CreateJSON(bool status)
|
||||||
{
|
{
|
||||||
if( status )
|
if( status )
|
||||||
cur->request->page << "[true]\n";
|
cur->request->out_streams[0] << "[true]\n";
|
||||||
else
|
else
|
||||||
cur->request->page << "[false]\n";
|
cur->request->out_streams[0] << "[false]\n";
|
||||||
|
|
||||||
cur->request->page_generated = true;
|
cur->request->page_generated = true;
|
||||||
cur->request->use_html_filter = false;
|
cur->request->use_html_filter = false;
|
||||||
|
|
|
@ -29,6 +29,12 @@ Upload::Upload()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Upload::Init()
|
||||||
|
{
|
||||||
|
json_serializer.TreatAsTable(L"infospace");
|
||||||
|
json_serializer.TreatAsNumeric(L"size");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Upload::HasAccess(const Item & item)
|
bool Upload::HasAccess(const Item & item)
|
||||||
{
|
{
|
||||||
|
@ -188,7 +194,7 @@ void Upload::UploadMulti()
|
||||||
}
|
}
|
||||||
|
|
||||||
if( is_jquery_upload )
|
if( is_jquery_upload )
|
||||||
CreateJSON();
|
CreateAnswer();
|
||||||
else
|
else
|
||||||
system->RedirectToLastDir();
|
system->RedirectToLastDir();
|
||||||
}
|
}
|
||||||
|
@ -224,7 +230,7 @@ void Upload::UploadSingle()
|
||||||
post_file.tmp_filename.clear();
|
post_file.tmp_filename.clear();
|
||||||
|
|
||||||
if( is_jquery_upload )
|
if( is_jquery_upload )
|
||||||
CreateJSON();
|
CreateAnswer();
|
||||||
else
|
else
|
||||||
if( cur->request->status == WINIX_ERR_OK )
|
if( cur->request->status == WINIX_ERR_OK )
|
||||||
system->RedirectTo(cur->request->item, L"/cat");
|
system->RedirectTo(cur->request->item, L"/cat");
|
||||||
|
@ -255,19 +261,40 @@ void Upload::MakePost()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Upload::CreateJSON()
|
void Upload::CreateAnswer()
|
||||||
{
|
{
|
||||||
size_t loc = TemplatesFunctions::locale.GetCurLang();
|
Request & req = *cur->request;
|
||||||
Ezc::Pattern * pat = TemplatesFunctions::patterns.Get(template_index, loc);
|
req.info.name = L"infospace"; // 'infospace' will be serialized to an array
|
||||||
|
|
||||||
if( pat )
|
for(size_t i=0 ; i<req.item_tab.size() ; ++i)
|
||||||
{
|
{
|
||||||
templates->Generate(*pat);
|
PT::Space & file = req.info.AddSpace(L"");
|
||||||
cur->request->page_generated = true;
|
|
||||||
cur->request->use_html_filter = false;
|
file.Add(L"name", req.item_tab[i].url);
|
||||||
|
file.Add(L"size", req.item_tab[i].file_size);
|
||||||
|
|
||||||
|
std::wstring & link = file.Add(L"url", L"");
|
||||||
|
system->CreateItemLink(req.item_tab[i], link);
|
||||||
|
|
||||||
|
std::wstring & del_url = file.Add(L"delete_url", link);
|
||||||
|
del_url += L"/rm/jquery_upload";
|
||||||
|
|
||||||
|
file.Add(L"delete_type", L"POST");
|
||||||
|
|
||||||
|
if( req.item_tab[i].file_type == WINIX_ITEM_FILETYPE_IMAGE )
|
||||||
|
{
|
||||||
|
std::wstring & thumb = file.Add(L"thumbnail_url", link);
|
||||||
|
|
||||||
|
if( req.item_tab[i].has_thumb )
|
||||||
|
thumb += L"/-/thumb";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cur->request->return_json = true;
|
||||||
|
cur->request->return_info_only = true;
|
||||||
|
cur->request->info_serializer = &json_serializer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Upload::MakeGet()
|
void Upload::MakeGet()
|
||||||
{
|
{
|
||||||
|
@ -280,7 +307,7 @@ void Upload::MakeGet()
|
||||||
|
|
||||||
db->GetItems(cur->request->item_tab, query);
|
db->GetItems(cur->request->item_tab, query);
|
||||||
|
|
||||||
CreateJSON();
|
CreateAnswer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* This file is a part of Winix
|
* This file is a part of Winix
|
||||||
* and is not publicly distributed
|
* and is not publicly distributed
|
||||||
*
|
*
|
||||||
* Copyright (c) 2010, Tomasz Sowa
|
* Copyright (c) 2010-2013, Tomasz Sowa
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@ -11,7 +11,7 @@
|
||||||
#define headerfile_winix_functions_upload
|
#define headerfile_winix_functions_upload
|
||||||
|
|
||||||
#include "functionbase.h"
|
#include "functionbase.h"
|
||||||
|
#include "space/spacetojson.h"
|
||||||
|
|
||||||
|
|
||||||
namespace Fun
|
namespace Fun
|
||||||
|
@ -35,6 +35,13 @@ private:
|
||||||
DbItemQuery query;
|
DbItemQuery query;
|
||||||
bool is_jquery_upload;
|
bool is_jquery_upload;
|
||||||
|
|
||||||
|
// this object is used in App at the end of a request
|
||||||
|
// for serializing Request::info to JSON
|
||||||
|
// this will make a problem if in the future we'll use multithread requests
|
||||||
|
PT::SpaceToJSON json_serializer;
|
||||||
|
|
||||||
|
void Init();
|
||||||
|
|
||||||
bool HasAccess(const Item & item);
|
bool HasAccess(const Item & item);
|
||||||
bool UploadSaveStaticFile(const Item & item, const std::wstring & tmp_filename);
|
bool UploadSaveStaticFile(const Item & item, const std::wstring & tmp_filename);
|
||||||
bool FunUploadCheckAbuse();
|
bool FunUploadCheckAbuse();
|
||||||
|
@ -42,7 +49,7 @@ private:
|
||||||
void UploadSingle();
|
void UploadSingle();
|
||||||
void ResizeImage(Item & item);
|
void ResizeImage(Item & item);
|
||||||
void CreateThumb(Item & item);
|
void CreateThumb(Item & item);
|
||||||
void CreateJSON();
|
void CreateAnswer();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
[content]
|
|
|
@ -1 +0,0 @@
|
||||||
[content]
|
|
|
@ -20,13 +20,11 @@ namespace TemplatesFunctions
|
||||||
|
|
||||||
size_t pat_index; // main index pattern
|
size_t pat_index; // main index pattern
|
||||||
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_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 <html>, <body>)
|
|
||||||
size_t pat_index_ajaxcontent; // ajax pattern (only content, similar as pat_index_rawcontent)
|
|
||||||
size_t pat_err_404; // 404 error
|
size_t pat_err_404; // 404 error
|
||||||
size_t pat_err_per_denied; // permission denied error
|
size_t pat_err_per_denied; // permission denied error
|
||||||
|
|
||||||
Patterns patterns; // all html patterns
|
Patterns patterns; // all html patterns
|
||||||
IndexPatterns index_patterns; // patterns for main index template (those from mountpoint)
|
IndexPatterns index_patterns; // patterns for main index templates (those from mountpoint)
|
||||||
// index_patterns uses patterns as a storage
|
// index_patterns uses patterns as a storage
|
||||||
ChangePatterns change_patterns; // patterns for change_template mount option (storage is in 'patterns' too)
|
ChangePatterns change_patterns; // patterns for change_template mount option (storage is in 'patterns' too)
|
||||||
PatternCacher pattern_cacher; // patterns for user items (files with an executable bit set)
|
PatternCacher pattern_cacher; // patterns for user items (files with an executable bit set)
|
||||||
|
@ -822,8 +820,6 @@ using namespace TemplatesFunctions;
|
||||||
|
|
||||||
pat_index = patterns.Add(config->templates_index);
|
pat_index = patterns.Add(config->templates_index);
|
||||||
pat_index_fullscreen = patterns.Add(L"index_fullscreen.html");
|
pat_index_fullscreen = patterns.Add(L"index_fullscreen.html");
|
||||||
pat_index_rawcontent = patterns.Add(L"index_rawcontent.html");
|
|
||||||
pat_index_ajaxcontent = patterns.Add(L"index_ajaxcontent.html");
|
|
||||||
pat_err_404 = patterns.Add(L"err_404.html");
|
pat_err_404 = patterns.Add(L"err_404.html");
|
||||||
pat_err_per_denied = patterns.Add(L"err_per_denied.html");
|
pat_err_per_denied = patterns.Add(L"err_per_denied.html");
|
||||||
|
|
||||||
|
@ -910,12 +906,6 @@ using namespace TemplatesFunctions;
|
||||||
|
|
||||||
Ezc::Pattern * index = 0;
|
Ezc::Pattern * index = 0;
|
||||||
|
|
||||||
if( cur->request->ajax_serializer )
|
|
||||||
index = patterns.Get(pat_index_ajaxcontent, locale.GetCurLang());
|
|
||||||
else
|
|
||||||
if( cur->request->IsParam(L"rawcontent") )
|
|
||||||
index = patterns.Get(pat_index_rawcontent, locale.GetCurLang());
|
|
||||||
else
|
|
||||||
if( cur->request->IsParam(L"fullscreen") )
|
if( cur->request->IsParam(L"fullscreen") )
|
||||||
index = patterns.Get(pat_index_fullscreen, locale.GetCurLang());
|
index = patterns.Get(pat_index_fullscreen, locale.GetCurLang());
|
||||||
else
|
else
|
||||||
|
@ -954,7 +944,7 @@ using namespace TemplatesFunctions;
|
||||||
generator.SkipNewLine(gen_skip_new_line);
|
generator.SkipNewLine(gen_skip_new_line);
|
||||||
generator.RecognizeSpecialChars(gen_use_special_chars);
|
generator.RecognizeSpecialChars(gen_use_special_chars);
|
||||||
generator.SetMax(config->ezc_max_elements, config->ezc_max_loop_elements);
|
generator.SetMax(config->ezc_max_elements, config->ezc_max_loop_elements);
|
||||||
generator.Generate(cur->request->page, *index);
|
generator.Generate(cur->request->out_streams, *index);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -971,7 +961,10 @@ using namespace TemplatesFunctions;
|
||||||
if( !empty_pars.empty() )
|
if( !empty_pars.empty() )
|
||||||
empty_pars.clear();
|
empty_pars.clear();
|
||||||
|
|
||||||
Info info(cur->request->page, empty_pars, empty_string, empty_stream);
|
// !! FIX ME
|
||||||
|
// at the moment stream 0 is used
|
||||||
|
// here should be something other
|
||||||
|
Info info(cur->request->out_streams[0], empty_pars, empty_string, empty_stream);
|
||||||
|
|
||||||
info.iter = 0;
|
info.iter = 0;
|
||||||
info.res = false;
|
info.res = false;
|
||||||
|
@ -988,7 +981,7 @@ using namespace TemplatesFunctions;
|
||||||
generator.SkipNewLine(gen_skip_new_line);
|
generator.SkipNewLine(gen_skip_new_line);
|
||||||
generator.RecognizeSpecialChars(gen_use_special_chars);
|
generator.RecognizeSpecialChars(gen_use_special_chars);
|
||||||
generator.SetMax(config->ezc_max_elements, config->ezc_max_loop_elements);
|
generator.SetMax(config->ezc_max_elements, config->ezc_max_loop_elements);
|
||||||
generator.Generate(cur->request->page, pattern);
|
generator.Generate(cur->request->out_streams, pattern);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -37,9 +37,7 @@ class Functions;
|
||||||
namespace TemplatesFunctions
|
namespace TemplatesFunctions
|
||||||
{
|
{
|
||||||
extern size_t pat_index;
|
extern size_t pat_index;
|
||||||
extern size_t pat_index_ajaxcontent;
|
|
||||||
extern size_t pat_index_fullscreen;
|
extern size_t pat_index_fullscreen;
|
||||||
extern size_t pat_index_rawcontent;
|
|
||||||
extern size_t pat_err_404;
|
extern size_t pat_err_404;
|
||||||
extern size_t pat_err_per_denied;
|
extern size_t pat_err_per_denied;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue