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
00034 rq = args->rq;
00035 rs = args->rs;
00036
00037
00038 oio = response_io(rs);
00039
00040
00041 dbg_err_if((http = request_get_http(rq)) == NULL);
00042 dbg_err_if((so = http_get_session_opt(http)) == NULL);
00043
00044
00045 dbg_err_if(request_parse_data(rq));
00046
00047
00048 dbg_err_if(session_create(so, rq, rs, &args->ss));
00049
00050
00051 ss = args->ss;
00052
00053
00054 dbg_err_if(response_set_content_type(rs, "text/html"));
00055
00056
00057 response_disable_caching(rs);
00058
00059
00060
00061 dbg_err_if(response_filter_create(rq, rs, ss, &filter));
00062 io_codec_add_tail(oio, filter);
00063
00064
00065 args->fun(args);
00066
00067
00068 io_flush(oio);
00069
00070
00071
00072
00073 if(!response_filter_feeded(filter))
00074 io_write(oio, "\n", 1);
00075
00076
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