static inline bstring Dir_calculate_response(Request *req, FileRecord *file) { int if_unmodified_since = 0; int if_modified_since = 0; bstring if_match = NULL; bstring if_none_match = NULL; if(file) { if(file->is_dir) return bformat(DIR_REDIRECT_FORMAT, bdata(req->host), bdata(req->uri)); if_match = Request_get(req, &HTTP_IF_MATCH); if(!if_match || biseqcstr(if_match, "*") || bstring_match(if_match, &ETAG_PATTERN)) { if_none_match = Request_get(req, &HTTP_IF_NONE_MATCH); if_unmodified_since = Request_get_date(req, &HTTP_IF_UNMODIFIED_SINCE, RFC_822_TIME); if_modified_since = Request_get_date(req, &HTTP_IF_MODIFIED_SINCE, RFC_822_TIME); debug("TESTING WITH: if_match: %s, if_none_match: %s, if_unmodified_since: %d, if_modified_since: %d", bdata(if_match), bdata(if_none_match), if_unmodified_since, if_modified_since); if(if_unmodified_since) { if(file->sb.st_mtime > if_unmodified_since) { req->status_code = 412; return &HTTP_412; } else if(if_none_match) { return Dir_none_match(req, file, if_modified_since, if_none_match); } else if(if_modified_since) { return Dir_if_modified_since(req, file, if_modified_since); } } else if(if_none_match) { return Dir_none_match(req, file, if_modified_since, if_none_match); } else if(if_modified_since) { return Dir_if_modified_since(req, file, if_modified_since); } else { // they've got nothing, 200 req->status_code = 200; return NULL; } } else { req->status_code = 412; return &HTTP_412; } } else { req->status_code = 404; return &HTTP_404; } req->status_code = 500; return &HTTP_500; }
inline bstring Dir_none_match(Request *req, FileRecord *file, int if_modified_since, bstring if_none_match) { if(biseqcstr(if_none_match, "*") || biseq(if_none_match, file->etag)) { return &HTTP_304; } else { if(if_modified_since) { return Dir_if_modified_since(req, file, if_modified_since); } else { return NULL; } } return &HTTP_500; }