Browse Source

[plugin_core] rename 'blank' action to 'respond' and allow optional integer, string or list of integer+string parameters which support patterns

personal/stbuehler/wip
Thomas Porzelt 11 years ago
parent
commit
cdf183137f
  1. 79
      src/main/plugin_core.c
  2. 8
      tests/t-header-modify.py

79
src/main/plugin_core.c

@ -914,26 +914,87 @@ static liAction* core_log_write(liServer *srv, liWorker *wrk, liPlugin* p, liVal
}
static liHandlerResult core_handle_blank(liVRequest *vr, gpointer param, gpointer *context) {
UNUSED(param);
typedef struct respond_param respond_param;
struct respond_param {
guint status_code;
liPattern *pattern;
};
static void core_respond_free(liServer *srv, gpointer param) {
respond_param *rp = param;
UNUSED(srv);
if (rp->pattern)
li_pattern_free(rp->pattern);
g_slice_free(respond_param, rp);
}
static liHandlerResult core_handle_respond(liVRequest *vr, gpointer param, gpointer *context) {
respond_param *rp = param;
UNUSED(context);
if (!li_vrequest_handle_direct(vr)) return LI_HANDLER_GO_ON;
if (!li_vrequest_handle_direct(vr))
return LI_HANDLER_GO_ON;
vr->response.http_status = rp->status_code;
vr->response.http_status = 200;
if (!li_http_header_lookup(vr->response.headers, CONST_STR_LEN("content-type")))
li_http_header_insert(vr->response.headers, CONST_STR_LEN("Content-Type"), CONST_STR_LEN("text/plain"));
if (rp->pattern) {
g_string_truncate(vr->wrk->tmp_str, 0);
li_pattern_eval(vr, vr->wrk->tmp_str, rp->pattern, NULL, NULL, NULL, NULL);
li_chunkqueue_append_mem(vr->out, GSTR_LEN(vr->wrk->tmp_str));
}
return LI_HANDLER_GO_ON;
}
static liAction* core_blank(liServer *srv, liWorker *wrk, liPlugin* p, liValue *val, gpointer userdata) {
static liAction* core_respond(liServer *srv, liWorker *wrk, liPlugin* p, liValue *val, gpointer userdata) {
respond_param *rp;
UNUSED(wrk); UNUSED(p); UNUSED(userdata);
if (val) {
ERROR(srv, "%s", "'blank' action doesn't have parameters");
rp = g_slice_new(respond_param);
if (!val) {
// respond;
rp->status_code = 200;
rp->pattern = NULL;
} else if (val->type == LI_VALUE_STRING) {
// respond "foo";
rp->status_code = 200;
rp->pattern = li_pattern_new(srv, val->data.string->str);
if (!rp->pattern) {
g_slice_free(respond_param, rp);
ERROR(srv, "%s", "'respond' action takes an optional string as parameter");
return NULL;
}
} else if (val->type == LI_VALUE_NUMBER) {
// respond 404;
rp->status_code = val->data.number;
rp->pattern = NULL;
} else if (val->type == LI_VALUE_LIST && val->data.list->len == 2 && g_array_index(val->data.list, liValue*, 0)->type == LI_VALUE_NUMBER && g_array_index(val->data.list, liValue*, 1)->type == LI_VALUE_STRING) {
// respond 200 => "foo";
rp->status_code = g_array_index(val->data.list, liValue*, 0)->data.number;
rp->pattern = li_pattern_new(srv, g_array_index(val->data.list, liValue*, 1)->data.string->str);
if (!rp->pattern) {
g_slice_free(respond_param, rp);
ERROR(srv, "%s", "'respond' action takes an optional string as parameter");
return NULL;
}
} else {
g_slice_free(respond_param, rp);
ERROR(srv, "%s", "'respond' action takes an optional string as parameter");
return NULL;
}
return li_action_new_function(core_handle_blank, NULL, NULL, NULL);
return li_action_new_function(core_handle_respond, NULL, core_respond_free, rp);
}
@ -1874,7 +1935,7 @@ static const liPluginAction actions[] = {
{ "log.write", core_log_write, NULL },
{ "blank", core_blank, NULL },
{ "respond", core_respond, NULL },
{ "env.set", core_env_set, NULL },
{ "env.add", core_env_add, NULL },

8
tests/t-header-modify.py

@ -8,7 +8,7 @@ class TestHeaderAdd(CurlRequest):
config = """
header.add "Test-Header" => "%{req.query}";
header.add "Test-Header" => "%{req.path}";
blank;
respond;
"""
URL = "/path?simple_query"
@ -24,7 +24,7 @@ class TestHeaderAppend(CurlRequest):
config = """
header.append "Test-Header" => "%{req.query}";
header.append "Test-Header" => "%{req.path}";
blank;
respond;
"""
URL = "/path?simple_query"
@ -40,7 +40,7 @@ class TestHeaderOverwrite(CurlRequest):
config = """
header.overwrite "Test-Header" => "%{req.query}";
header.overwrite "Test-Header" => "%{req.path}";
blank;
respond;
"""
URL = "/path?simple_query"
@ -56,7 +56,7 @@ class TestHeaderRemove(CurlRequest):
config = """
header.add "Test-Header" => "%{req.query}";
header.remove "Test-Header";
blank;
respond;
"""
URL = "/path?simple_query"

Loading…
Cancel
Save