Connection *Connection_create(Server *srv, int fd, int rport, const char *remote, SSL_CTX *ssl_ctx) { Connection *conn = h_calloc(sizeof(Connection), 1); check_mem(conn); conn->server = srv; conn->rport = rport; memcpy(conn->remote, remote, IPADDR_SIZE); conn->remote[IPADDR_SIZE] = '\0'; conn->type = 0; conn->req = Request_create(); check_mem(conn->req); if(ssl_ctx != NULL) { conn->iob = IOBuf_create(BUFFER_SIZE, fd, IOBUF_SSL); check(conn->iob != NULL, "Failed to create the SSL IOBuf."); conn->iob->ssl = ssl_server_new(ssl_ctx, IOBuf_fd(conn->iob)); check(conn->iob->ssl != NULL, "Failed to create new ssl for connection"); } else { conn->iob = IOBuf_create(BUFFER_SIZE, fd, IOBUF_SOCKET); } return conn; error: Connection_destroy(conn); return NULL; }
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; }
Request *fake_req(const char *method, const char *path) { int rc = 0; size_t nparsed = 0; Request *req = Request_create(); Request_start(req); bstring p = bfromcstr(path); bstring rp = bformat(REQ_PATTERN, method, bdata(p)); rc = Request_parse(req, bdata(rp), blength(rp), &nparsed); check(rc != 0, "Failed to parse request."); check(nparsed == blength(rp), "Failed to parse all of request."); return req; error: return NULL; }
char *test_Multiple_Header_Request() { int rc = 0; size_t nparsed = 0; 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_21", "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."); mu_assert(Request_get(req, &COOKIE_HEADER) != NULL, "Should have an cookie header."); bstring payload = Request_to_payload(req, &JSON_METHOD, 0, "", 0,conn, NULL); debug("PAYLOAD IS: %s", bdata(payload)); mu_assert(bstrcmp(payload, &EXPECTED_COOKIE_HEADER) == 0, "Expected header not in correct format."); Request_destroy(req); bdestroy(payload); bdestroy(data); return NULL; }
Connection *Connection_create(Server *srv, int fd, int rport, const char *remote) { Connection *conn = calloc(sizeof(Connection),1); check_mem(conn); conn->req = Request_create(); conn->proxy_iob = NULL; conn->rport = rport; conn->client = NULL; conn->close = 0; conn->type = 0; conn->filter_state = NULL; memcpy(conn->remote, remote, IPADDR_SIZE); conn->remote[IPADDR_SIZE] = '\0'; conn->handler = NULL; check_mem(conn->req); if(srv != NULL && srv->use_ssl) { conn->iob = IOBuf_create(BUFFER_SIZE, fd, IOBUF_SSL); check(conn->iob != NULL, "Failed to create the SSL IOBuf."); ssl_set_own_cert(&conn->iob->ssl, &srv->own_cert, &srv->rsa_key); ssl_set_dh_param(&conn->iob->ssl, srv->dhm_P, srv->dhm_G); ssl_set_ciphersuites(&conn->iob->ssl, srv->ciphers); } else { conn->iob = IOBuf_create(BUFFER_SIZE, fd, IOBUF_SOCKET); } return conn; error: Connection_destroy(conn); return NULL; }
/* Given a minibus, returns all the events for it, with an additional request on top */ Request * stopsForMinibus(Minibus *minibus, Simulation *simulation, Request *request) { //printf("\nChecking which stops minibus %d needs to visit\n", minibus->id); Request *requests = malloc(12 * sizeof(Request*)); requests[0] = *request; int i = 1; EventQueue *tmp = head; while (tmp != NULL) { Request *request = (Request*) tmp->event.data; if (request) { if (request->minibus) { if (request->minibus->id) { if (request->minibus->id == minibus->id) { //if(tmp->event.callbackFunction == busArrived) { if (tmp->event.executionTime >= simulation->currentTime) { requests[i] = *(Request*) tmp->event.data; i++; // printf("Minibus %d has an upcoming stop %d, desired boarding time %d\n", minibus->id, request->startStop, request->desiredBoardingTime); } } }} }} tmp = tmp->next; } for (int j = i; j <12; j++) { requests[j] = *Request_create(0,0,0); } return requests; }