void test_decode(void **state) { struct berval req_val; struct extdom_req *req; int ret; req_val.bv_val = req_sid; req_val.bv_len = sizeof(req_sid); ret = parse_request_data(&req_val, &req); assert_int_equal(ret, LDAP_SUCCESS); assert_int_equal(req->input_type, INP_SID); assert_int_equal(req->request_type, REQ_SIMPLE); assert_string_equal(req->data.sid, "S-1-2-3-4"); free_req_data(req); req_val.bv_val = req_nam; req_val.bv_len = sizeof(req_nam); ret = parse_request_data(&req_val, &req); assert_int_equal(ret, LDAP_SUCCESS); assert_int_equal(req->input_type, INP_NAME); assert_int_equal(req->request_type, REQ_SIMPLE); assert_string_equal(req->data.name.domain_name, "DOMAIN"); assert_string_equal(req->data.name.object_name, "test"); free_req_data(req); req_val.bv_val = req_uid; req_val.bv_len = sizeof(req_uid); ret = parse_request_data(&req_val, &req); assert_int_equal(ret, LDAP_SUCCESS); assert_int_equal(req->input_type, INP_POSIX_UID); assert_int_equal(req->request_type, REQ_SIMPLE); assert_string_equal(req->data.posix_uid.domain_name, "DOMAIN"); assert_int_equal(req->data.posix_uid.uid, 12345); free_req_data(req); req_val.bv_val = req_gid; req_val.bv_len = sizeof(req_gid); ret = parse_request_data(&req_val, &req); assert_int_equal(ret, LDAP_SUCCESS); assert_int_equal(req->input_type, INP_POSIX_GID); assert_int_equal(req->request_type, REQ_SIMPLE); assert_string_equal(req->data.posix_gid.domain_name, "DOMAIN"); assert_int_equal(req->data.posix_gid.gid, 54321); free_req_data(req); }
static void got_api(struct evhttp_request* req, void* userdata) { struct req_data* d = (struct req_data*) userdata; if(req->response_code != 200) { evhttp_send_error(d->req, 500, "Internal Server Error"); free_req_data(&d); fprintf(stderr, "info.c:got_api(): api returned http status %d\n", (int)(req->response_code)); return; } XML_Parser parser = XML_ParserCreate(NULL); int done; int depth = 0; XML_SetUserData(parser, d); XML_SetElementHandler(parser, startElement, endElement); XML_SetCharacterDataHandler(parser, xmlData); char buf[4096]; int buflen; while((buflen = evbuffer_remove(req->input_buffer, buf, 4096)) > 0) { if(XML_Parse(parser, buf, buflen, 0) == XML_STATUS_ERROR) { evhttp_send_error(d->req, 500, "Internal Server Error"); free_req_data(&d); fprintf(stderr, "info.c:got_api(): error parsing xml: %s\n", XML_ErrorString(XML_GetErrorCode(parser))); return; } } XML_ParserFree(parser); // return static result struct evbuffer *evbuf; evbuf = evbuffer_new(); if (buf == NULL) { evhttp_send_error(d->req, 500, "Internal Server Error"); free_req_data(&d); fprintf(stderr, "info.c:got_api(): couldn't alloc evbuffer\n"); return; } evhttp_remove_header(d->req->output_headers, "content-type"); evhttp_add_header(d->req->output_headers, "content-type", "application/json"); evhttp_add_header(d->req->output_headers, "cache-control", "no-cache"); evbuffer_add_printf(evbuf, "{ \"eventName\": \"%s\", \"description\": \"%s\", \"serverTime\": %d, \"startTime\": %d, \"duration\": %d, \"login\": \"%s\", \"title\": \"%s\", \"profile_image\": \"%s\" }\n", d->event_title, d->description, (int)time(0), (int)(d->start), d->duration, d->login, d->channel_title, d->profile_image); evhttp_send_reply(d->req, 200, "OK", evbuf); evbuffer_free(evbuf); free_req_data(&d); }
static int extdom_req_teardown(void **state) { struct test_data *test_data; test_data = (struct test_data *) *state; free_req_data(test_data->req); back_extdom_free_context(&test_data->ctx->nss_ctx); free(test_data->ctx); free(test_data); return 0; }
static void do_info(struct evhttp_request* req, void* userdata) { // Check request method if(req->type == EVHTTP_REQ_POST || req->type == EVHTTP_REQ_HEAD) { evhttp_send_error(req, 405, "Method Not Allowed"); return; } // Allocate userdata structure struct req_data* d; if(!(d = (struct req_data*) malloc(sizeof(struct req_data)))) { evhttp_send_error(req, 500, "Internal Server Error"); fprintf(stderr, "info.c:do_info(): couldn't malloc req_data\n"); return; } memset(d, 0, sizeof(struct req_data)); d->req = req; // Parse url query parameters char * decoded_uri; if(!(decoded_uri = evhttp_decode_uri(req->uri))) { free_req_data(&d); evhttp_send_error(req, 500, "Internal Server Error"); fprintf(stderr, "info.c:do_info(): couldn't decode uri\n"); return; } if(!(d->query_args = (struct evkeyvalq*) malloc(sizeof(struct evkeyvalq)))) { free_req_data(&d); evhttp_send_error(req, 500, "Internal Server Error"); fprintf(stderr, "info.c:do_info(): couldn't malloc evkeyvalq\n"); return; } memset(d->query_args, 0, sizeof(struct evkeyvalq)); evhttp_parse_query(decoded_uri, d->query_args); free(decoded_uri); // find id field; build request const char* id = evhttp_find_header(d->query_args, "id"); if(!id || strlen(id)>20) { free_req_data(&d); evhttp_send_error(req, 404, "Not Found"); return; } struct evhttp_request* api_req; if(!(api_req = evhttp_request_new(got_api, d))) { free_req_data(&d); evhttp_send_error(req, 500, "Internal Server Error"); fprintf(stderr, "info.c:do_info(): couldn't alloc evhttp_request"); return; } char api_url[64]; sprintf(api_url, "/api/event/show/%s.xml", id); evhttp_add_header(api_req->output_headers, "host", "api.justin.tv"); printf("%s\n", api_url); // issue request if(!(d->conn = evhttp_connection_new("api.justin.tv", 80))) { evhttp_request_free(api_req); free_req_data(&d); evhttp_send_error(req, 500, "Internal Server Error"); fprintf(stderr, "info.c:do_info(): couldn't alloc evhttp_connection\n"); return; } if(evhttp_make_request(d->conn, api_req, EVHTTP_REQ_GET, api_url) == -1) { free_req_data(&d); evhttp_send_error(req, 500, "Internal Server Error"); fprintf(stderr, "info.c:do_info(): error making api request\n"); } }