Qore WebUtil Module Reference 1.6.2
Loading...
Searching...
No Matches
WebUtil.qm.dox.h
1// -*- mode: c++; indent-tabs-mode: nil -*-
3
4/* WebUtil.qm Copyright (C) 2013 - 2023 Qore Technologies, s.r.o.
5
6 Permission is hereby granted, free of charge, to any person obtaining a
7 copy of this software and associated documentation files (the "Software"),
8 to deal in the Software without restriction, including without limitation
9 the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 and/or sell copies of the Software, and to permit persons to whom the
11 Software is furnished to do so, subject to the following conditions:
12
13 The above copyright notice and this permission notice shall be included in
14 all copies or substantial portions of the Software.
15
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 DEALINGS IN THE SOFTWARE.
23*/
24
25// minimum Qore version
26
27// require type definitions everywhere
28
29// enable all warnings
30
31// do not use "$" signs, assume local vars
32
33
34
106namespace WebUtil {
109
110public:
111
112
113protected:
115 ReadOnlyFile f;
117 bool txt;
119 int cs;
121 *hash<auto> respHdr;
122
123public:
124
127 ;
128
129
131protected:
132 hash<HttpResponseInfo> getResponseHeaderMessageImpl();
133public:
134
135
137protected:
138 auto sendImpl();
139public:
140
141 };
142
145
146public:
147
148
149protected:
151 InputStream stream;
153 int cs;
155 *hash<auto> respHdr;
156
157public:
158
161 ;
162
163
165protected:
166 hash<HttpResponseInfo> getResponseHeaderMessageImpl();
167public:
168
169
171protected:
172 auto sendImpl();
173public:
174
175 };
176
177 class AbstractTemplate {
178
179public:
181
196 hash<HttpResponseInfo> render(date new_mtime, hash<auto> ctx, int http_code = 200, *hash<auto> hdr);
197
198
200
211protected:
212 abstract hash<HttpResponseInfo> renderImpl(date new_mtime, hash<auto> ctx, int http_code = 200, *hash<auto> hdr);
213public:
214 };
215
218
219public:
221 const DefaultProgramOptions = PO_REQUIRE_OUR|PO_NO_TOP_LEVEL_STATEMENTS|PO_NO_INHERIT_USER_FUNC_VARIANTS|PO_NO_INHERIT_GLOBAL_VARS|PO_NO_USER_CLASSES|PO_NO_TERMINAL_IO;
222
224
250 static string add(Qore::Program p, string fn, string name, string src);
251
253protected:
254 static string getCode(bool bare_refs, string fmt);
255public:
256
257
259protected:
260 static bool doBlock(string end, reference<string> src, string type, reference<int> i, reference<list<hash>> l);
261public:
262
263
265 static string getContentType(string name);
266 };
267
270
271public:
272protected:
274 Program p;
275
276public:
277
280
281
283 Program getProgram();
284
285 };
286
288class FileTemplate : public AbstractTemplate, public TextTemplateBase {
289
290public:
291protected:
293 int po;
294
296 string path;
297
299 string ct;
300
302 const TemplateFunc = "t";
303
305 *code psetup;
306
308 RWLock rwl();
309
311 *date mtime;
312
313public:
314
315
317
321 constructor(string resource_path, int parse_opts = DefaultProgramOptions, *code pgm_setup) ;
322
323
325
340protected:
341 hash<HttpResponseInfo> renderImpl(date new_mtime, hash<auto> ctx, int http_code = 200, *hash<auto> hdr);
342public:
343
344
345protected:
346 setupTemplateIntern(date new_mtime);
347public:
348
349 };
350
352
356
357public:
358protected:
360 RWLock rwl();
361
363 hash<string, AbstractTemplate> th;
364
366 int po;
367
369 *code psetup;
370
371public:
372
374
379
380
382
399 hash<HttpResponseInfo> render(string tname, string path, date mtime, hash<auto> ctx, int code = 200, *hash<auto> hdr);
400
401
403 purge(string tname);
404
405 };
406
408
414
415public:
416protected:
418 hash<string, TextTemplateBase> toh;
419
421 hash<string, hash<auto>> th;
422
424 Sequence seq();
425
427 int po;
428
429public:
430
433
434
436
461 string add(string name, string src, *string ct);
462
463
465 bool hasTemplate(string tname);
466
467
469
486 hash<HttpResponseInfo> render(string tname, hash<auto> ctx, int code = 200, *hash<auto> hdr);
487
488
490
505 *hash<HttpResponseInfo> tryRender(string tname, hash<auto> ctx, int code = 200, *hash<auto> hdr);
506
507
509 *hash<string, bool> getTemplateHash();
510
511
513 list<string> getTemplateList();
514
515
517 setupProgram(Program p);
518
519 };
520
523
524public:
526 string file_root;
527
529 softlist indexes = (Defaults.IndexTemplate, Defaults.IndexFile);
530
532 hash template_extensions = Defaults.TemplateExtensions;
533
536
538 softint chunked_threshold = Defaults.ChunkedThreshold;
539
541 softint chunk_size = Defaults.ChunkSize;
542
544
549 softint error_level = 0;
550
552 const Unix = (PlatformOS != "Windows");
553
556
558
562
564 const Defaults = {
565 // default index file
566 "IndexFile": "index.html",
567 "IndexTemplate": "index.qhtml",
568 "TemplateExtensions": {
569 "qhtml": True,
570 },
571 "ChunkedThreshold": 10 * 1024,
572 "ChunkSize": 4096,
573 };
574
576 const Dirlisting = ...;
577
578
579protected:
582
583public:
584
586
602 constructor(string new_file_root, string url_root = '/', *hash<auto> opt) ;
603
604
605protected:
606 string getDirlistingTemplate();
607public:
608
609
611
654 hash<HttpResponseInfo> handleRequest(HttpServer::HttpListenerInterface listener, Qore::Socket s, hash<auto> cx, hash<auto> hdr, *data body);
655
656
658 logInfo(string fmt);
659
660
662 logError(string fmt);
663
664
666 logDebug(string fmt);
667
668
670
672protected:
673 hash<HttpResponseInfo> unhandledRequest(hash<auto> cx, hash<auto> hdr, *data body);
674public:
675
676
678
680protected:
681 hash<HttpResponseInfo> fileError(hash<auto> cx, hash<auto> sh);
682public:
683
684
686
688protected:
689 hash<HttpResponseInfo> serverError(hash<auto> cx, hash<auto> ex);
690public:
691
692
694protected:
695 *hash<HttpResponseInfo> tryServeRequest(HttpServer::HttpListenerInterface listener, Qore::Socket s, hash<auto> cx, hash<auto> hdr, *data body);
696public:
697
698
699protected:
700 *hash<HttpResponseInfo> sendFilePath(HttpServer::HttpListenerInterface listener, Qore::Socket s, hash<auto> cx, hash<auto> hdr, *data body, string path, hash<StatInfo> stat_hash);
701public:
702
703
704protected:
705 *hash<StatInfo> statPath(hash<auto> cx, hash<auto> hdr, reference<string> path);
706public:
707
708
710protected:
711 AbstractStreamRequest getStreamRequestImpl(HttpServer::HttpListenerInterface listener, Qore::Socket s, hash<auto> cx, hash<auto> hdr, *data body, InputStream stream, *hash<auto> respHdr);
712public:
713
714
716
727protected:
728 hash<auto> getResponseHeadersForFile(string path, hash<auto> cx, hash<auto> request_hdr);
729public:
730
731
733protected:
734 hash<HttpResponseInfo> sendFile(InputStream stream, *hash<auto> respHdr);
735public:
736
737
739protected:
740 hash<HttpResponseInfo> sendFileChunked(HttpServer::HttpListenerInterface listener, Qore::Socket s, hash<auto> cx, hash<auto> hdr, *data body, InputStream stream, *hash<auto> respHdr);
741public:
742
743
745
748 *hash<HttpResponseInfo> renderDirectory(hash<auto> cx, string path);
749
750
752
783protected:
784 *hash<HttpResponseInfo> handleRequestImpl(reference<hash<auto>> cx, hash<auto> hdr, *data body);
785public:
786
787 };
788};
AbstractHttpRequestHandler handler
HttpListenerInterface listener
this class serves files from the file system based on a root location
Definition: WebUtil.qm.dox.h:522
softint error_level
set for error info level
Definition: WebUtil.qm.dox.h:549
hash< HttpResponseInfo > fileError(hash< auto > cx, hash< auto > sh)
this method returns a 400 "Bad Request" error code when a file should be served that's not a regular ...
hash< HttpResponseInfo > serverError(hash< auto > cx, hash< auto > ex)
this method returns a 500 "Internal Server Error" error code when an exception occurs
hash< auto > getResponseHeadersForFile(string path, hash< auto > cx, hash< auto > request_hdr)
this method returns a hash giving response headers with a default content type for the file to be ser...
const Defaults
default configuration values
Definition: WebUtil.qm.dox.h:564
softint chunk_size
HTTP chunk size in bytes.
Definition: WebUtil.qm.dox.h:541
logError(string fmt)
default implementation is empty; this method is called with error log messages; reimplement in subcla...
const DefaultFileReadTimeout
default read timeout for serving files
Definition: WebUtil.qm.dox.h:555
const Dirlisting
dirlisting template
Definition: WebUtil.qm.dox.h:576
StaticTemplateManager stm()
static templates
AbstractStreamRequest getStreamRequestImpl(HttpServer::HttpListenerInterface listener, Qore::Socket s, hash< auto > cx, hash< auto > hdr, *data body, InputStream stream, *hash< auto > respHdr)
must return a AbstractStreamRequest object to stream the requested file with chunked transfer encodin...
*hash< HttpResponseInfo > renderDirectory(hash< auto > cx, string path)
this method is called when a directory should be rendered
logDebug(string fmt)
default implementation is empty; this method is called with debug log messages; reimplement in subcla...
const Unix
flag for UNIX operating systems
Definition: WebUtil.qm.dox.h:552
*hash< HttpResponseInfo > tryServeRequest(HttpServer::HttpListenerInterface listener, Qore::Socket s, hash< auto > cx, hash< auto > hdr, *data body)
tries to serve the request from the filesystem
*string default_target
the default target if a URL cannot be satisfied
Definition: WebUtil.qm.dox.h:535
hash< HttpResponseInfo > sendFile(InputStream stream, *hash< auto > respHdr)
returns a handler hash response with the data to be sent in a monolithic message
hash< HttpResponseInfo > handleRequest(HttpServer::HttpListenerInterface listener, Qore::Socket s, hash< auto > cx, hash< auto > hdr, *data body)
this method calls handleRequestImpl() to service the request, if handleRequestImpl() returns NOTHING,...
const DirSep
directory separator character
Definition: WebUtil.qm.dox.h:561
hash< HttpResponseInfo > unhandledRequest(hash< auto > cx, hash< auto > hdr, *data body)
this method returns a 404 "Not Found" error code to GET requests and a 501 "Not Implemented" error co...
softlist indexes
indexes for directories; handled in order of appearance
Definition: WebUtil.qm.dox.h:529
string file_root
root directory for serving files
Definition: WebUtil.qm.dox.h:526
softint chunked_threshold
minimum size in bytes for plain files to be sent with a chnked transfer
Definition: WebUtil.qm.dox.h:538
logInfo(string fmt)
default implementation is empty; this method is called with informational log messages; reimplement i...
hash template_extensions
file extensions handled as templates
Definition: WebUtil.qm.dox.h:532
hash< HttpResponseInfo > sendFileChunked(HttpServer::HttpListenerInterface listener, Qore::Socket s, hash< auto > cx, hash< auto > hdr, *data body, InputStream stream, *hash< auto > respHdr)
returns a handler hash response with the file's data to be sent in a HTTP message with chunked transf...
constructor(string new_file_root, string url_root='/', *hash< auto > opt)
create the object optionally with the given HttpServer::AbstractAuthenticator
*hash< HttpResponseInfo > handleRequestImpl(reference< hash< auto > > cx, hash< auto > hdr, *data body)
this method is called by this class's handleRequest() before trying to service the request automatica...
this class handles chunked file sends
Definition: WebUtil.qm.dox.h:108
hash< HttpResponseInfo > getResponseHeaderMessageImpl()
returns the reponse headers
bool txt
text flag
Definition: WebUtil.qm.dox.h:117
constructor(HttpServer::HttpListenerInterface listener, HttpServer::AbstractHttpRequestHandler handler, Qore::Socket s, hash< auto > cx, hash< auto > hdr, *data body, Qore::ReadOnlyFile file, bool textflag, int chunk_size, *hash< auto > respHdr)
creates the object
auto sendImpl()
returns data to send
int cs
chunk size
Definition: WebUtil.qm.dox.h:119
*hash< auto > respHdr
response headers
Definition: WebUtil.qm.dox.h:121
ReadOnlyFile f
file object
Definition: WebUtil.qm.dox.h:115
manages a template resource that may need to be recompiled if the file is updated in the filesystem; ...
Definition: WebUtil.qm.dox.h:288
int po
parse options used on the program
Definition: WebUtil.qm.dox.h:293
string ct
the content type of the rendered template
Definition: WebUtil.qm.dox.h:299
RWLock rwl()
to ensure atomicity regarding contention between setup/recompiles and rendering requests
*code psetup
code to perform Program initialization when creating a new Program object (inport API,...
Definition: WebUtil.qm.dox.h:305
const TemplateFunc
the name of the template function
Definition: WebUtil.qm.dox.h:302
string path
the path to the template
Definition: WebUtil.qm.dox.h:296
*date mtime
file's modification time
Definition: WebUtil.qm.dox.h:311
constructor(string resource_path, int parse_opts=DefaultProgramOptions, *code pgm_setup)
creates the object based on the pathname and Program options
hash< HttpResponseInfo > renderImpl(date new_mtime, hash< auto > ctx, int http_code=200, *hash< auto > hdr)
explicitly renders the given template with the given argument
this class handles chunked file sends
Definition: WebUtil.qm.dox.h:144
*hash< auto > respHdr
response headers
Definition: WebUtil.qm.dox.h:155
InputStream stream
input stream object
Definition: WebUtil.qm.dox.h:151
auto sendImpl()
returns data to send
hash< HttpResponseInfo > getResponseHeaderMessageImpl()
returns the reponse headers
constructor(HttpServer::HttpListenerInterface listener, HttpServer::AbstractHttpRequestHandler handler, Qore::Socket s, hash< auto > cx, hash< auto > hdr, *data body, InputStream stream, int chunk_size, *hash< auto > respHdr)
creates the object
int cs
chunk size
Definition: WebUtil.qm.dox.h:153
A container for holding static text templates (ie that do not change once created in the template man...
Definition: WebUtil.qm.dox.h:413
Sequence seq()
Sequence for template function names.
int po
parse options for template containers
Definition: WebUtil.qm.dox.h:427
constructor(int po=DefaultProgramOptions)
sets up the object
hash< string, hash< auto > > th
Maps template names to function names.
Definition: WebUtil.qm.dox.h:421
*hash< string, bool > getTemplateHash()
returns a hash of template names, values are True or NOTHING if no templates are currently cached
setupProgram(Program p)
override in subclasses to customize the setup of template Programs; this method performs no action
string add(string name, string src, *string ct)
adds a template to the object
list< string > getTemplateList()
returns a list of template names, an empty list is returned if there are no templates
bool hasTemplate(string tname)
returns True if the given template exists, False if not
hash< string, TextTemplateBase > toh
Maps template names to TextTemplateBase objects.
Definition: WebUtil.qm.dox.h:418
*hash< HttpResponseInfo > tryRender(string tname, hash< auto > ctx, int code=200, *hash< auto > hdr)
explicitly renders the given template with the given argument context hash if the template exists; if...
hash< HttpResponseInfo > render(string tname, hash< auto > ctx, int code=200, *hash< auto > hdr)
explicitly renders the given template with the given argument
this is the static base class for all template Program container classes
Definition: WebUtil.qm.dox.h:217
const DefaultProgramOptions
default parse options for template Programs
Definition: WebUtil.qm.dox.h:221
static string getContentType(string name)
returns the content type from the file name, ignores any leading "q" in the extensions,...
static string add(Qore::Program p, string fn, string name, string src)
adds a template function to a template Program object
static bool doBlock(string end, reference< string > src, string type, reference< int > i, reference< list< hash > > l)
a helper method used in parsing
static string getCode(bool bare_refs, string fmt)
a helper method that strips dollar signs from code when PO_ALLOW_BARE_REFS is set in the template pro...
this class manages templates based on files
Definition: WebUtil.qm.dox.h:355
hash< string, AbstractTemplate > th
hash for template storage
Definition: WebUtil.qm.dox.h:363
purge(string tname)
this method can be called when a resource is requested that no longer exists in case a template is st...
hash< HttpResponseInfo > render(string tname, string path, date mtime, hash< auto > ctx, int code=200, *hash< auto > hdr)
explicitly renders the given template with the given path and context argument
RWLock rwl()
read-write lock for managing template access
*code psetup
code to perform Program initialization when creating a new Program object (inport API,...
Definition: WebUtil.qm.dox.h:369
int po
parse options used on the program
Definition: WebUtil.qm.dox.h:366
constructor(int parse_opts=StaticTextTemplateBase::DefaultProgramOptions, *code pgm_setup)
creates the object with optional Program options
this is the base class for all template Program container classes
Definition: WebUtil.qm.dox.h:269
Program p
Holds the template generation function.
Definition: WebUtil.qm.dox.h:274
Program getProgram()
returns the contained Program object
constructor(int po=DefaultProgramOptions)
sets up the object
const DirSep
the WebUtil namespace contains all the objects in the WebUtil module
Definition: WebUtil.qm.dox.h:106