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; }
void Server_init() { int mq_threads = Setting_get_int("zeromq.threads", 1); if(mq_threads > 1) { log_info("WARNING: Setting zeromq.threads greater than 1 can cause lockups in your handlers."); } log_info("Starting 0MQ with %d threads.", mq_threads); mqinit(mq_threads); Register_init(); Request_init(); Connection_init(); }
static void on_connection(uv_stream_t* server, int status) { //当有客户端连接时触发 int r; Request* request; struct sockaddr_in sockaddr; //定义套接字地址 socklen_t addrlen; uv_stream_t* handle; dprint("on connection."); if (status != 0) { //状态判断, 状态必须为0 fprintf(stderr, "Connect error %d\n", uv_last_error(loop).code); } ASSERT(status == 0); handle = malloc(sizeof(uv_tcp_t)); GIL_LOCK(0); request = Request_init(); GIL_UNLOCK(0); r = uv_tcp_init(loop, (uv_tcp_t*)handle);//初始化连接流结构体 ASSERT(r == 0); r = uv_accept(server, handle); ASSERT(r == 0); //-----------------得到客户端信息 addrlen = sizeof(struct sockaddr_in); r = uv_tcp_getpeername((uv_tcp_t *)handle, (struct sockaddr *)&sockaddr, &addrlen); ASSERT(r == 0); request->client_addr = PyString_FromString(inet_ntoa(sockaddr.sin_addr)); request->client_fd = 1;//request->ev_watcher.socket; request->ev_watcher = handle; handle->data = request; DBG_REQ(request, "Accepted client %s:%d on fd %d", inet_ntoa(sockaddr.sin_addr), ntohs(sockaddr.sin_port), (int)(GET_HANDLE_FD(handle))); //@@@@@@@@@@@@@@@@@free(&sockaddr); //-----------------读事件循环 r = uv_read_start(handle, on_alloc, on_read); ASSERT(r == 0); }
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; }