char *test_Dir_serve_file() { int rc = 0; Request *req = NULL; Dir *test = Dir_create("tests/", "sample.html", "test/plain"); Connection conn = {0}; conn.fd = 1; conn.send = my_send; req = fake_req("GET", "/sample.json"); rc = Dir_serve_file(test, req, &conn); mu_assert(rc == -1, "Should fail to write since it's not a socket."); req = fake_req("HEAD", "/sample.json"); rc = Dir_serve_file(test, req, &conn); mu_assert(rc == -1, "Should fail to write since it's not a socket."); req = fake_req("POST", "/sample.json"); rc = Dir_serve_file(test, req, &conn); mu_assert(rc == -1, "Should fail to write since it's not a socket."); return NULL; }
char *test_Dir_serve_file() { int rc = 0; Request *req = NULL; Dir *test = Dir_create( bfromcstr("tests/"), bfromcstr("sample.html"), bfromcstr("test/plain"), 0); Connection conn = {.iob = NULL}; int zero_fd = open("/dev/null", O_WRONLY); conn.iob = IOBuf_create(1024, zero_fd, IOBUF_NULL); req = fake_req("GET", "/", "/sample.json"); rc = Dir_serve_file(test, req, &conn); // TODO: different platforms barf on sendfile for different reasons // mu_assert(req->response_size > -1, "Should serve the /sample.json"); req = fake_req("HEAD", "/", "/sample.json"); rc = Dir_serve_file(test, req, &conn); mu_assert(rc == 0, "Should serve the HEAD of /sample.json"); req = fake_req("POST", "/", "/sample.json"); rc = Dir_serve_file(test, req, &conn); mu_assert(rc == -1, "POST should pass through but send an error."); mu_assert(req->status_code == 405, "POST to file should 405."); req = fake_req("GET", "/tests/", "/test"); rc = Dir_serve_file(test, req, &conn); mu_assert(rc == -1, "GET of path shorter than prefix should 404"); mu_assert(req->status_code == 404, "GET shortpath should 404."); return NULL; }
int connection_http_to_directory(Connection *conn) { Dir *dir = Request_get_action(conn->req, dir); int rc = Dir_serve_file(dir, conn->req, conn); check_debug(rc == 0, "Failed to serve file: %s", bdata(Request_path(conn->req))); IOBuf_read_commit(conn->iob, Request_header_length(conn->req) + Request_content_length(conn->req)); Log_request(conn, conn->req->status_code, conn->req->response_size); if(conn->close) { return CLOSE; } else { return RESP_SENT; } error: return CLOSE; }