in native/common/jk_status.c [1161:1292]
static void status_write_uri(jk_ws_service_t *s,
status_endpoint_t *p,
const char *text,
int cmd, int mime,
const char *worker, const char *sub_worker,
unsigned int add_options, unsigned int rm_options,
const char *attribute,
jk_log_context_t *l)
{
int i;
int sz;
int started = 0;
int from;
int restore_sub_worker = JK_FALSE;
int save_sub_worker = JK_FALSE;
int prev;
unsigned int opt = 0;
const char *arg;
jk_map_t *m = p->req_params;
if (text)
jk_puts(s, "<a href=\"");
jk_puts(s, p->req_uri);
status_get_string(p, JK_STATUS_ARG_FROM, NULL, &arg, l);
from = status_cmd_int(arg);
status_get_string(p, JK_STATUS_ARG_CMD, NULL, &arg, l);
prev = status_cmd_int(arg);
if (cmd == JK_STATUS_CMD_SHOW && prev == JK_STATUS_CMD_EDIT) {
restore_sub_worker = JK_TRUE;
}
if (cmd == JK_STATUS_CMD_UNKNOWN) {
if (prev == JK_STATUS_CMD_UPDATE ||
prev == JK_STATUS_CMD_RESET ||
prev == JK_STATUS_CMD_RECOVER) {
cmd = from;
restore_sub_worker = JK_TRUE;
}
}
if (cmd != JK_STATUS_CMD_UNKNOWN) {
jk_printf(s, l, "%s%s=%s", started ? "&" : "?",
JK_STATUS_ARG_CMD, status_cmd_text(cmd));
if (cmd == JK_STATUS_CMD_EDIT ||
cmd == JK_STATUS_CMD_RESET ||
cmd == JK_STATUS_CMD_RECOVER) {
jk_printf(s, l, "%s%s=%s", "&",
JK_STATUS_ARG_FROM, status_cmd_text(prev));
save_sub_worker = JK_TRUE;
}
started=1;
}
if (mime != JK_STATUS_MIME_UNKNOWN) {
jk_printf(s, l, "%s%s=%s", started ? "&" : "?",
JK_STATUS_ARG_MIME, status_mime_text(mime));
started=1;
}
if (worker && worker[0]) {
jk_printf(s, l, "%s%s=%s", started ? "&" : "?",
JK_STATUS_ARG_WORKER, worker);
started=1;
}
if (sub_worker && sub_worker[0] && cmd != JK_STATUS_CMD_LIST) {
jk_printf(s, l, "%s%s=%s", started ? "&" : "?",
JK_STATUS_ARG_SUB_WORKER, sub_worker);
started=1;
}
if (attribute && attribute[0]) {
jk_printf(s, l, "%s%s=%s", started ? "&" : "?",
JK_STATUS_ARG_ATTRIBUTE, attribute);
started=1;
}
sz = jk_map_size(m);
for (i = 0; i < sz; i++) {
const char *k = jk_map_name_at(m, i);
const char *v = jk_map_value_at(m, i);
if (!strcmp(k, JK_STATUS_ARG_CMD) && cmd != JK_STATUS_CMD_UNKNOWN) {
continue;
}
if (!strcmp(k, JK_STATUS_ARG_MIME) && mime != JK_STATUS_MIME_UNKNOWN) {
continue;
}
if (!strcmp(k, JK_STATUS_ARG_FROM)) {
continue;
}
if (!strcmp(k, JK_STATUS_ARG_WORKER) && worker) {
continue;
}
if (!strcmp(k, JK_STATUS_ARG_SUB_WORKER)) {
if (save_sub_worker == JK_TRUE) {
jk_printf(s, l, "%s%s=%s", started ? "&" : "?",
JK_STATUS_ARG_PREV_SUB_WORKER, v);
started=1;
continue;
}
else if (sub_worker || cmd == JK_STATUS_CMD_LIST) {
continue;
}
else if (restore_sub_worker == JK_TRUE) {
continue;
}
}
if (!strcmp(k, JK_STATUS_ARG_PREV_SUB_WORKER) && restore_sub_worker == JK_TRUE && cmd != JK_STATUS_CMD_LIST) {
jk_printf(s, l, "%s%s=%s", started ? "&" : "?",
JK_STATUS_ARG_SUB_WORKER, v);
started=1;
continue;
}
if (!strcmp(k, JK_STATUS_ARG_ATTRIBUTE) && attribute) {
continue;
}
if (!strcmp(k, JK_STATUS_ARG_ATTRIBUTE) && cmd != JK_STATUS_CMD_UPDATE && cmd != JK_STATUS_CMD_EDIT) {
continue;
}
if (!strncmp(k, JK_STATUS_ARG_MULT_VALUE_BASE, 3) && cmd != JK_STATUS_CMD_UPDATE) {
continue;
}
if (k[0] == 'v' && cmd != JK_STATUS_CMD_UPDATE) {
continue;
}
if (!strcmp(k, JK_STATUS_ARG_OPTIONS)) {
opt = atoi(v);
continue;
}
jk_printf(s, l, "%s%s=%s", started ? "&" : "?", k, v);
started=1;
}
if (opt | add_options | rm_options)
jk_printf(s, l, "%s%s=%u", started ? "&" : "?",
JK_STATUS_ARG_OPTIONS, (opt | add_options) & ~rm_options);
if (text)
jk_putv(s, "\">", text, "</a>", NULL);
}