#define STAT_CLI_O_TAB 8 /* dump tables */
#define STAT_CLI_O_CLR 9 /* clear tables */
-/* status codes (strictly 4 chars) used in the URL to display a message */
-#define STAT_STATUS_UNKN "UNKN" /* an unknown error occured, shouldn't happen */
-#define STAT_STATUS_DONE "DONE" /* the action is successful */
-#define STAT_STATUS_PART "PART" /* the action is partially successful */
-#define STAT_STATUS_NONE "NONE" /* nothing happened (no action chosen or servers state didn't change) */
-#define STAT_STATUS_ERRP "ERRP" /* an error occured due to invalid values in parameters */
-#define STAT_STATUS_EXCD "EXCD" /* an error occured because the buffer couldn't store all data */
-#define STAT_STATUS_DENY "DENY" /* action denied */
-
extern struct si_applet http_stats_applet;
void stats_io_handler(struct stream_interface *si);
ST_ADM_ACTION_ENABLE,
};
+/* status codes available for the stats admin page */
+enum {
+ STAT_STATUS_INIT = 0,
+ STAT_STATUS_DENY, /* action denied */
+ STAT_STATUS_DONE, /* the action is successful */
+ STAT_STATUS_ERRP, /* an error occured due to invalid values in parameters */
+ STAT_STATUS_EXCD, /* an error occured because the buffer couldn't store all data */
+ STAT_STATUS_NONE, /* nothing happened (no action chosen or servers state didn't change) */
+ STAT_STATUS_PART, /* the action is partially successful */
+ STAT_STATUS_UNKN, /* an unknown error occured, shouldn't happen */
+ STAT_STATUS_SIZE
+};
+
/* This is an HTTP message, as described in RFC2616. It can be either a request
* message or a response message.
*
int px_st; /* STAT_PX_ST* */
unsigned int flags; /* STAT_* */
int iid, type, sid; /* proxy id, type and service id if bounding of stats is enabled */
- const char *st_code; /* pointer to the status code returned by an action */
+ int st_code; /* the status code returned by an action */
} stats;
struct {
struct bref bref; /* back-reference from the session being dumped */
STAT_PX_ST_FIN,
};
+extern const char *stat_status_codes[];
+
/* This function is called from the session-level accept() in order to instanciate
* a new stats socket. It returns a positive value upon success, 0 if the connection
* needs to be closed and ignored, or a negative value upon critical failure.
"Content-Type: text/plain\r\n"
"Connection: close\r\n"
"Location: %s;st=%s",
- uri->uri_prefix, si->applet.ctx.stats.st_code);
+ uri->uri_prefix,
+ ((si->applet.ctx.stats.st_code > STAT_STATUS_INIT) &&
+ (si->applet.ctx.stats.st_code < STAT_STATUS_SIZE) &&
+ stat_status_codes[si->applet.ctx.stats.st_code]) ?
+ stat_status_codes[si->applet.ctx.stats.st_code] :
+ stat_status_codes[STAT_STATUS_UNKN]);
chunk_printf(&msg, "\r\n\r\n");
if (buffer_feed_chunk(si->ib, &msg) >= 0)
);
if (si->applet.ctx.stats.st_code) {
- if (strcmp(si->applet.ctx.stats.st_code, STAT_STATUS_DONE) == 0) {
+ switch (si->applet.ctx.stats.st_code) {
+ case STAT_STATUS_DONE:
chunk_printf(&msg,
"<p><div class=active3>"
"<a class=lfsb href=\"%s\" title=\"Remove this message\">[X]</a> "
"Action processed successfully."
"</div>\n", uri->uri_prefix);
- }
- else if (strcmp(si->applet.ctx.stats.st_code, STAT_STATUS_NONE) == 0) {
+ break;
+ case STAT_STATUS_NONE:
chunk_printf(&msg,
"<p><div class=active2>"
"<a class=lfsb href=\"%s\" title=\"Remove this message\">[X]</a> "
"Nothing has changed."
"</div>\n", uri->uri_prefix);
- }
- else if (strcmp(si->applet.ctx.stats.st_code, STAT_STATUS_PART) == 0) {
+ break;
+ case STAT_STATUS_PART:
chunk_printf(&msg,
"<p><div class=active2>"
"<a class=lfsb href=\"%s\" title=\"Remove this message\">[X]</a> "
"Action partially processed.<br>"
"Some server names are probably unknown or ambiguous (duplicated names in the backend)."
"</div>\n", uri->uri_prefix);
- }
- else if (strcmp(si->applet.ctx.stats.st_code, STAT_STATUS_ERRP) == 0) {
+ break;
+ case STAT_STATUS_ERRP:
chunk_printf(&msg,
"<p><div class=active0>"
"<a class=lfsb href=\"%s\" title=\"Remove this message\">[X]</a> "
"<li>Some server names are probably unknown or ambiguous (duplicated names in the backend).</li>"
"</ul>"
"</div>\n", uri->uri_prefix);
- }
- else if (strcmp(si->applet.ctx.stats.st_code, STAT_STATUS_EXCD) == 0) {
+ break;
+ case STAT_STATUS_EXCD:
chunk_printf(&msg,
"<p><div class=active0>"
"<a class=lfsb href=\"%s\" title=\"Remove this message\">[X]</a> "
"<b>Action not processed : the buffer couldn't store all the data.<br>"
"You should retry with less servers at a time.</b>"
"</div>\n", uri->uri_prefix);
- }
- else if (strcmp(si->applet.ctx.stats.st_code, STAT_STATUS_DENY) == 0) {
+ break;
+ case STAT_STATUS_DENY:
chunk_printf(&msg,
"<p><div class=active0>"
"<a class=lfsb href=\"%s\" title=\"Remove this message\">[X]</a> "
"<b>Action denied.</b>"
"</div>\n", uri->uri_prefix);
- }
- else {
+ break;
+ default:
chunk_printf(&msg,
"<p><div class=active6>"
"<a class=lfsb href=\"%s\" title=\"Remove this message\">[X]</a> "
};
+/* status codes available for the stats admin page (strictly 4 chars length) */
+const char *stat_status_codes[STAT_STATUS_SIZE] = {
+ [STAT_STATUS_DENY] = "DENY",
+ [STAT_STATUS_DONE] = "DONE",
+ [STAT_STATUS_ERRP] = "ERRP",
+ [STAT_STATUS_EXCD] = "EXCD",
+ [STAT_STATUS_NONE] = "NONE",
+ [STAT_STATUS_PART] = "PART",
+ [STAT_STATUS_UNKN] = "UNKN",
+};
+
+
/* We must put the messages here since GCC cannot initialize consts depending
* on strlen().
*/
return 0;
memset(&si->applet.ctx.stats, 0, sizeof(si->applet.ctx.stats));
+ si->applet.ctx.stats.st_code = STAT_STATUS_INIT;
/* check URI size */
if (uri_auth->uri_len > txn->req.sl.rq.u_l)
h = txn->req.sol + txn->req.sl.rq.u + uri_auth->uri_len;
while (h <= txn->req.sol + txn->req.sl.rq.u + txn->req.sl.rq.u_l - 8) {
if (memcmp(h, ";st=", 4) == 0) {
+ int i;
h += 4;
-
- if (memcmp(h, STAT_STATUS_DONE, 4) == 0)
- si->applet.ctx.stats.st_code = STAT_STATUS_DONE;
- else if (memcmp(h, STAT_STATUS_NONE, 4) == 0)
- si->applet.ctx.stats.st_code = STAT_STATUS_NONE;
- else if (memcmp(h, STAT_STATUS_PART, 4) == 0)
- si->applet.ctx.stats.st_code = STAT_STATUS_PART;
- else if (memcmp(h, STAT_STATUS_ERRP, 4) == 0)
- si->applet.ctx.stats.st_code = STAT_STATUS_ERRP;
- else if (memcmp(h, STAT_STATUS_EXCD, 4) == 0)
- si->applet.ctx.stats.st_code = STAT_STATUS_EXCD;
- else if (memcmp(h, STAT_STATUS_DENY, 4) == 0)
- si->applet.ctx.stats.st_code = STAT_STATUS_DENY;
- else
- si->applet.ctx.stats.st_code = STAT_STATUS_UNKN;
+ for (i = STAT_STATUS_INIT + 1; i < STAT_STATUS_SIZE; i++) {
+ if (strncmp(stat_status_codes[i], h, 4) == 0) {
+ si->applet.ctx.stats.st_code = i;
+ break;
+ }
+ }
+ si->applet.ctx.stats.st_code = STAT_STATUS_UNKN;
break;
}
h++;