char *test_Request_create() { int rc = 0; size_t nparsed = 0; bstring fake_sender = bfromcstr("FAKESENDER"); Request_init(); Request *req = Request_create(); mu_assert(req != NULL, "Failed to create parser for request."); FILE *infile = fopen("tests/and_suite/ex_httpd_tst_16", "r"); mu_assert(infile != NULL, "Failed to open test file."); bstring data = bread((bNread)fread, infile); fclose(infile); mu_assert(data != NULL, "Failed to read test file."); mu_assert(blength(data) > 0, "Nothing in that file."); Request_start(req); rc = Request_parse(req, bdata(data), blength(data), &nparsed); mu_assert(rc == 1, "It should parse."); mu_assert(nparsed > 0, "Should have parsed something."); bstring payload = Request_to_payload(req, fake_sender, 0, "", 0,conn, NULL); debug("PAYLOAD IS: %s", bdata(payload)); bdestroy(payload); payload = Request_to_tnetstring(req, fake_sender, 0, "", 0,conn, NULL); debug("TNETSTRING PAYLOAD: '%.*s'", blength(payload), bdata(payload)); mu_assert(Request_get(req, &HTTP_IF_MODIFIED_SINCE) != NULL, "Should have an if-modified-since header."); mu_assert(req->host != NULL, "Should have Host header."); mu_assert(Request_get_date(req, &HTTP_IF_MODIFIED_SINCE, RFC_822_TIME) > 0, "Wrong time from header."); mu_assert(Request_get_date(req, &HTTP_IF_UNMODIFIED_SINCE, RFC_822_TIME) == 0, "Unmodified since should be invalid."); mu_assert(Request_get_date(req, &HTTP_IF_NONE_MATCH, RFC_822_TIME) == 0, "None match shouldn't even be a date."); Request_start(req); Request_destroy(req); // test with null Request_destroy(NULL); bdestroy(payload); bdestroy(fake_sender); bdestroy(data); return NULL; }
char *test_Request_payloads() { glob_t test_files; bstring fake_sender = bfromcstr("FAKESENDER"); Request *req = Request_create(); //Connection *conn=Connection_create(NULL,0,1,""); size_t nparsed = 0; unsigned int i = 0; int rc = glob("tests/and_suite/*", 0, NULL, &test_files); mu_assert(rc == 0, "Failed to glob file sin tests/and_suite/*"); FILE *test_cases = fopen("tests/request_payloads.txt", "w"); mu_assert(test_cases != NULL, "Failed to create the tests/request_payloads.txt file."); for(i = 0; i < test_files.gl_pathc; i++) { nparsed = 0; FILE *infile = fopen(test_files.gl_pathv[i], "r"); mu_assert(infile != NULL, "Failed to open test file."); bstring data = bread((bNread)fread, infile); fclose(infile); mu_assert(data != NULL, "Failed to read test file."); Request_start(req); rc = Request_parse(req, bdata(data), blength(data), &nparsed); if(rc == 1) { mu_assert(nparsed > 0, "Should have parsed something."); // TODO: fix this up so that we never get a null for path if(req->path == NULL) req->path = bfromcstr("/"); bstring payload = Request_to_payload(req, fake_sender, 0, "", 0,conn, NULL); bconchar(payload, '\n'); fwrite(payload->data, blength(payload), 1, test_cases); bdestroy(payload); payload = Request_to_tnetstring(req, fake_sender, 0, "", 0,conn, NULL); debug("TNETSTRING PAYLOAD: '%.*s'", blength(payload), bdata(payload)); bconchar(payload, '\n'); fwrite(payload->data, blength(payload), 1, test_cases); bdestroy(payload); } bdestroy(data); } globfree(&test_files); fclose(test_cases); bdestroy(fake_sender); Request_destroy(req); return NULL; }
int connection_msg_to_handler(Connection *conn) { Handler *handler = Request_get_action(conn->req, handler); int rc = 0; int header_len = Request_header_length(conn->req); // body_len will include \0 int body_len = Request_content_length(conn->req); check(handler, "JSON request doesn't match any handler: %s", bdata(Request_path(conn->req))); if(pattern_match(IOBuf_start(conn->iob), header_len + body_len, bdata(&PING_PATTERN))) { Register_ping(IOBuf_fd(conn->iob)); } else { check(body_len >= 0, "Parsing error, body length ended up being: %d", body_len); bstring payload = NULL; if(handler->protocol == HANDLER_PROTO_TNET) { payload = Request_to_tnetstring(conn->req, handler->send_ident, IOBuf_fd(conn->iob), IOBuf_start(conn->iob) + header_len, body_len - 1); // drop \0 on payloads } else if(handler->protocol == HANDLER_PROTO_JSON) { payload = Request_to_payload(conn->req, handler->send_ident, IOBuf_fd(conn->iob), IOBuf_start(conn->iob) + header_len, body_len - 1); // drop \0 on payloads } else { sentinel("Invalid protocol type: %d", handler->protocol); } debug("SENT: %s", bdata(payload)); check(payload != NULL, "Failed to generate payload."); check(handler->send_socket != NULL, "Handler socket is NULL, tell Zed."); rc = Handler_deliver(handler->send_socket, bdata(payload), blength(payload)); free(payload); check(rc == 0, "Failed to deliver to handler: %s", bdata(Request_path(conn->req))); } // consumes \0 from body_len check(IOBuf_read_commit(conn->iob, header_len + body_len) != -1, "Final commit failed."); return REQ_SENT; error: return CLOSE; }
int Connection_send_to_handler(Connection *conn, Handler *handler, char *body, int content_len) { int rc = 0; bstring payload = NULL; if(conn->iob->use_ssl) Connection_fingerprint_from_cert(conn); error_unless(handler->running, conn, 404, "Handler shutdown while trying to deliver: %s", bdata(Request_path(conn->req))); if(handler->protocol == HANDLER_PROTO_TNET) { payload = Request_to_tnetstring(conn->req, handler->send_ident, IOBuf_fd(conn->iob), body, content_len); } else if(handler->protocol == HANDLER_PROTO_JSON) { payload = Request_to_payload(conn->req, handler->send_ident, IOBuf_fd(conn->iob), body, content_len); } else { sentinel("Invalid protocol type: %d", handler->protocol); } check(payload, "Failed to create payload for request."); debug("HTTP TO HANDLER: %.*s", blength(payload) - content_len, bdata(payload)); rc = Handler_deliver(handler->send_socket, bdata(payload), blength(payload)); free(payload); payload = NULL; error_unless(rc != -1, conn, 502, "Failed to deliver to handler: %s", bdata(Request_path(conn->req))); return 0; error: if(payload) free(payload); return -1; }