dypage.c

00001 #include <klone/dypage.h>
00002 #include <klone/session.h>
00003 #include <klone/ses_prv.h>
00004 #include <klone/rsfilter.h>
00005 
00006 const char *dypage_get_param(dypage_args_t *args, const char *key)
00007 {
00008     int i;
00009 
00010     for(i = 0; i < args->nparams; ++i)
00011         if(strcmp(key, args->params[i].key) == 0)
00012             return args->params[i].val;
00013 
00014     return "";
00015 }
00016 
00017 int dypage_serve(dypage_args_t *args)
00018 {
00019     http_t *http = NULL;
00020     codec_t *filter = NULL;
00021     session_opt_t *so;
00022     request_t *rq;
00023     response_t *rs;
00024     session_t *ss;
00025     io_t *oio;
00026 
00027     dbg_return_if(args == NULL, ~0);
00028 
00029     dbg_return_if(args->rq == NULL, ~0);
00030     dbg_return_if(args->rs == NULL, ~0);
00031     dbg_return_if(args->fun == NULL, ~0);
00032 
00033     /* alias */
00034     rq = args->rq;
00035     rs = args->rs;
00036 
00037     /* output io object */
00038     oio = response_io(rs);
00039 
00040     /* get session options */
00041     dbg_err_if((http = request_get_http(rq)) == NULL);
00042     dbg_err_if((so = http_get_session_opt(http)) == NULL);
00043 
00044     /* parse URL encoded or POSTed data (POST must be read before) */
00045     dbg_err_if(request_parse_data(rq));
00046 
00047     /* create/get the session */
00048     dbg_err_if(session_create(so, rq, rs, &args->ss));
00049 
00050     /* alias */
00051     ss = args->ss;
00052 
00053     /* set some default values */
00054     dbg_err_if(response_set_content_type(rs, "text/html"));
00055 
00056     /* by default disable caching */
00057     response_disable_caching(rs);
00058 
00059     /* create a response filter (used to automatically print all header fields 
00060      * when the header buffer fills up) and attach it to the response io */
00061     dbg_err_if(response_filter_create(rq, rs, ss, &filter));
00062     io_codec_add_tail(oio, filter);
00063 
00064     /* run the page code */
00065     args->fun(args);
00066 
00067     /* flush the output buffer */
00068     io_flush(oio);
00069 
00070     /* if nothing has been printed by the script then write a dummy byte so 
00071      * the io_t calls the filter function that, in turn, will print out the 
00072      * HTTP header (rsfilter will handle it) */
00073     if(!response_filter_feeded(filter))
00074         io_write(oio, "\n", 1);
00075 
00076     /* save and destroy the session */
00077     session_free(ss); args->ss = ss = NULL;
00078 
00079     return 0;
00080 err:
00081     if(args->rs)
00082         io_flush(response_io(args->rs));
00083     if(args->ss)
00084     {
00085         session_free(args->ss);
00086         args->ss = NULL;
00087     }
00088     return ~0;
00089 }
00090 

←Products
Copyright © 2005-2012 - KoanLogic S.r.l. - All rights reserved