#include "error.h"
#include <cx/string.h>
#include "../util/pblock.h"
#include "../util/strbuf.h"
#define ERRMSG(s) { s,
sizeof(s)-
1 }
static cxmutstr error_400 =
ERRMSG(
"<html><body>bad request</body></html>");
static cxmutstr error_403 =
ERRMSG(
"<html><body>forbidden</body></html>");
static cxmutstr error_404 =
ERRMSG(
"<html><body>not found</body></html>");
static cxmutstr error_500 =
ERRMSG(
"<html><body>server error</body></html>");
static cxmutstr error_503 =
ERRMSG(
"<html><body>service unavailable</body></html>");
static cxmutstr error_std =
ERRMSG(
"<html><body>error</body></html>");
int nsapi_error_request(Session *sn, Request *rq) {
short status = rq->status_num;
cxmutstr msg;
if(status <=
0) {
status =
500;
msg = error_500;
}
else if(status <
400) {
msg.ptr =
NULL;
msg.length =
0;
}
else {
switch(status) {
default: msg = error_std;
case 403: {
msg = error_403;
break;
}
case 404: {
msg = error_404;
break;
}
case 500: {
msg = error_500;
break;
}
}
}
pblock_removekey(pb_key_content_type, rq->srvhdrs);
pblock_removekey(pb_key_content_length, rq->srvhdrs);
pblock_kninsert(pb_key_content_length, msg.length, rq->srvhdrs);
pblock_nvinsert(
"content-type",
"text/html", rq->srvhdrs);
protocol_status(sn, rq, status,
NULL);
http_start_response(sn, rq);
if(msg.length >
0) {
net_write(sn->csd, msg.ptr, msg.length);
}
return REQ_PROCEED;
}
void fatal_error(HTTPRequest *req,
int status) {
cxmutstr msg = error_500;
char *statusmsg =
"Internal Server Error";
switch(status) {
case 400: {
msg = error_400;
statusmsg =
"Bad request";
break;
}
case 500: {
msg = error_500;
statusmsg =
"Internal Server Error";
break;
}
case 503: {
msg = error_503;
statusmsg =
"Service Unavailable";
break;
}
}
char buf[
512];
int len = snprintf(buf,
512,
"HTTP/1.1 %d %s\r\nServer: webserver\r\nContent-type: text/html\r\nContent-length: %zd\r\n\r\n", status, statusmsg, msg.length);
int flags;
if (-
1 == (flags = fcntl(req->connection->fd,
F_GETFL,
0))) {
flags =
0;
}
if (fcntl(req->connection->fd,
F_SETFL, flags & ~
O_NONBLOCK) !=
0) {
}
req->connection->write(req->connection, buf, len);
req->connection->write(req->connection, msg.ptr, msg.length);
}