int serve_style_css(struct http_request *req) { int ret; char *date; time_t tstamp; tstamp = 0; if (http_request_header_get(req, "if-modified-since", &date)) { tstamp = kore_date_to_time(date); kore_mem_free(date); kore_debug("header was present with %ld", tstamp); } if (tstamp != 0 && tstamp <= static_mtime_css_style) { ret = http_response(req, 304, NULL, 0); } else { date = kore_time_to_date(static_mtime_css_style); if (date != NULL) http_response_header_add(req, "last-modified", date); http_response_header_add(req, "content-type", "text/css"); ret = http_response(req, 200, static_css_style, static_len_css_style); } return (ret); }
bool http_request_headers_finalize(http_request_t * const request) { header_list_t * header_list = request->headers; if (header_list) { char * method = http_request_header_get(request, ":method"); if (!method) { log_append(request->log, LOG_ERROR, "Missing :method header"); return NULL; } request->method = strdup(method); char * scheme = http_request_header_get(request, ":scheme"); if (!scheme) { log_append(request->log, LOG_ERROR, "Missing :scheme header"); return NULL; } request->scheme = strdup(scheme); if (!parse_path(request)) { return NULL; } parse_authority(request); parse_parameters(request->params, request->query_string); header_list_remove_pseudo_headers(header_list); } else { request->headers = header_list_init(NULL); } return request; }
int http_server_request_get_auth(struct http_server_request *req, struct http_auth_credentials *credentials) { const char *auth; auth = http_request_header_get(&req->req, "Authorization"); if (auth == NULL) return 0; if (http_auth_parse_credentials ((const unsigned char *)auth, strlen(auth), credentials) < 0) return -1; return 1; }
/** * Parses the ':path' special header into a plain * path and a query string */ static bool parse_path(http_request_t * const request) { char * path = http_request_header_get(request, ":path"); if (!path) { log_append(request->log, LOG_ERROR, "No :path header provided"); return false; } char * query = strchr(path, '?'); if (query) { COPY_STRING(request->path, path, query - path); } else { request->path = strdup(path); } request->query_string = query ? strdup(query + 1) : NULL; return true; }
/** * Parses the ':authority' special header * into the host and port */ static void parse_authority(http_request_t * const request) { char * authority = http_request_header_get(request, ":authority"); request->authority = authority; if (authority) { char * port = strchr(authority, ':'); if (port) { COPY_STRING(request->host, authority, port - authority); request->port = strtoul(port + 1, NULL, 10); } else { request->host = strdup(authority); request->port = 80; } } else { request->host = NULL; request->port = 0; } }