Introduction
Introduction Statistics Contact Development Disclaimer Help
Replace http_send_status() with http_prepare_error_response() - quark - quark w…
git clone git://git.suckless.org/quark
Log
Files
Refs
LICENSE
---
commit 123f168a3b5d1e378aa2827d6306a0270b553f90
parent 601b56d27095e4340e5afcf3385465a1f7f96d98
Author: Laslo Hunhold <[email protected]>
Date: Fri, 28 Aug 2020 22:32:47 +0200
Replace http_send_status() with http_prepare_error_response()
This approach fits better in line of first initializing the response
struct and then sending the header with http_send_header() later.
Signed-off-by: Laslo Hunhold <[email protected]>
Diffstat:
M http.c | 70 ++++++++++++++++-------------…
M http.h | 2 ++
M main.c | 22 +++++++++++-----------
3 files changed, 50 insertions(+), 44 deletions(-)
---
diff --git a/http.c b/http.c
@@ -99,42 +99,18 @@ http_send_header(int fd, const struct response *res)
esc) < 0) {
return S_REQUEST_TIMEOUT;
}
- }
-
- return res->status;
-}
-
-enum status
-http_send_status(int fd, enum status s)
-{
- enum status sendstatus;
-
- struct response res = {
- .status = s,
- .field[RES_CONTENT_TYPE] = "text/html; charset=utf-8",
- };
-
- if (s == S_METHOD_NOT_ALLOWED) {
- if (esnprintf(res.field[RES_ALLOW],
- sizeof(res.field[RES_ALLOW]), "%s",
- "Allow: GET, HEAD")) {
- return S_INTERNAL_SERVER_ERROR;
+ } else if (res->type == RESTYPE_ERROR) {
+ if (dprintf(fd,
+ "<!DOCTYPE html>\n<html>\n\t<head>\n"
+ "\t\t<title>%d %s</title>\n\t</head>\n\t<body>\n"
+ "\t\t<h1>%d %s</h1>\n\t</body>\n</html>\n",
+ res->status, status_str[res->status],
+ res->status, status_str[res->status]) < 0) {
+ return S_REQUEST_TIMEOUT;
}
}
- if ((sendstatus = http_send_header(fd, &res)) != s) {
- return sendstatus;
- }
-
- if (dprintf(fd,
- "<!DOCTYPE html>\n<html>\n\t<head>\n"
- "\t\t<title>%d %s</title>\n\t</head>\n\t<body>\n"
- "\t\t<h1>%d %s</h1>\n\t</body>\n</html>\n",
- s, status_str[s], s, status_str[s]) < 0) {
- return S_REQUEST_TIMEOUT;
- }
-
- return s;
+ return res->status;
}
static void
@@ -827,3 +803,31 @@ http_prepare_response(const struct request *req, struct re…
return 0;
}
+
+void
+http_prepare_error_response(const struct request *req,
+ struct response *res, enum status s)
+{
+ /* used later */
+ (void)req;
+
+ /* empty all response fields */
+ memset(res, 0, sizeof(*res));
+
+ res->type = RESTYPE_ERROR;
+ res->status = s;
+
+ if (esnprintf(res->field[RES_CONTENT_TYPE],
+ sizeof(res->field[RES_CONTENT_TYPE]),
+ "text/html; charset=utf-8")) {
+ res->status = S_INTERNAL_SERVER_ERROR;
+ }
+
+ if (res->status == S_METHOD_NOT_ALLOWED) {
+ if (esnprintf(res->field[RES_ALLOW],
+ sizeof(res->field[RES_ALLOW]),
+ "Allow: GET, HEAD")) {
+ res->status = S_INTERNAL_SERVER_ERROR;
+ }
+ }
+}
diff --git a/http.h b/http.h
@@ -105,5 +105,7 @@ enum status http_recv_header(int, char *, size_t, size_t *);
enum status http_parse_header(const char *, struct request *);
enum status http_prepare_response(const struct request *, struct response *,
const struct server *);
+void http_prepare_error_response(const struct request *,
+ struct response *, enum status);
#endif /* HTTP_H */
diff --git a/main.c b/main.c
@@ -41,16 +41,16 @@ serve(int infd, const struct sockaddr_storage *in_sa, const…
if ((status = http_recv_header(c.fd, c.header, LEN(c.header), &c.off))…
(status = http_parse_header(c.header, &c.req)) ||
(status = http_prepare_response(&c.req, &c.res, srv))) {
- status = http_send_status(c.fd, status);
- } else {
- status = http_send_header(c.fd, &c.res);
-
- /* send data */
- if (c.res.type == RESTYPE_FILE) {
- resp_file(c.fd, &c.res);
- } else if (c.res.type == RESTYPE_DIRLISTING) {
- resp_dir(c.fd, &c.res);
- }
+ http_prepare_error_response(&c.req, &c.res, status);
+ }
+
+ status = http_send_header(c.fd, &c.res);
+
+ /* send data */
+ if (c.res.type == RESTYPE_FILE) {
+ resp_file(c.fd, &c.res);
+ } else if (c.res.type == RESTYPE_DIRLISTING) {
+ resp_dir(c.fd, &c.res);
}
/* write output to log */
@@ -63,7 +63,7 @@ serve(int infd, const struct sockaddr_storage *in_sa, const s…
if (sock_get_inaddr_str(in_sa, inaddr, LEN(inaddr))) {
goto cleanup;
}
- printf("%s\t%s\t%d\t%s\t%s\n", tstmp, inaddr, status,
+ printf("%s\t%s\t%d\t%s\t%s\n", tstmp, inaddr, c.res.status,
c.req.field[REQ_HOST], c.req.uri);
cleanup:
/* clean up and finish */
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.