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; }
char *test_blocks() { // ( and ) are ignored but allowed for routing system later m = pattern_match("ZED", strlen("ZEED"), "Z(ED)"); mu_assert(m != NULL, "Should match."); bstring s = bfromcstr("ZED"); bstring p = bfromcstr("Z(ED)"); m = bstring_match(s, p); mu_assert(m != NULL, "Should match."); bdestroy(s); bdestroy(p); return NULL; }