static void on_read(void *user_data, gpr_slice *slices, size_t nslices, grpc_endpoint_cb_status status) { internal_request *req = user_data; size_t i; for (i = 0; i < nslices; i++) { if (GPR_SLICE_LENGTH(slices[i])) { req->have_read_byte = 1; if (!grpc_httpcli_parser_parse(&req->parser, slices[i])) { finish(req, 0); goto done; } } } switch (status) { case GRPC_ENDPOINT_CB_OK: grpc_endpoint_notify_on_read(req->ep, on_read, req); break; case GRPC_ENDPOINT_CB_EOF: case GRPC_ENDPOINT_CB_ERROR: case GRPC_ENDPOINT_CB_SHUTDOWN: if (!req->have_read_byte) { next_address(req); } else { finish(req, grpc_httpcli_parser_eof(&req->parser)); } break; } done: for (i = 0; i < nslices; i++) { gpr_slice_unref(slices[i]); } }
static void test_fails(grpc_slice_split_mode split_mode, char *response) { grpc_httpcli_parser parser; gpr_slice input_slice = gpr_slice_from_copied_string(response); size_t num_slices; size_t i; gpr_slice *slices; int done = 0; grpc_split_slices(split_mode, &input_slice, 1, &slices, &num_slices); gpr_slice_unref(input_slice); grpc_httpcli_parser_init(&parser); for (i = 0; i < num_slices; i++) { if (!done && !grpc_httpcli_parser_parse(&parser, slices[i])) { done = 1; } gpr_slice_unref(slices[i]); } if (!done && !grpc_httpcli_parser_eof(&parser)) { done = 1; } GPR_ASSERT(done); grpc_httpcli_parser_destroy(&parser); gpr_free(slices); }
static void test_succeeds(grpc_slice_split_mode split_mode, char *response, int expect_status, char *expect_body, ...) { grpc_httpcli_parser parser; gpr_slice input_slice = gpr_slice_from_copied_string(response); size_t num_slices; size_t i; gpr_slice *slices; va_list args; grpc_split_slices(split_mode, &input_slice, 1, &slices, &num_slices); gpr_slice_unref(input_slice); grpc_httpcli_parser_init(&parser); for (i = 0; i < num_slices; i++) { GPR_ASSERT(grpc_httpcli_parser_parse(&parser, slices[i])); gpr_slice_unref(slices[i]); } GPR_ASSERT(grpc_httpcli_parser_eof(&parser)); GPR_ASSERT(expect_status == parser.r.status); if (expect_body != NULL) { GPR_ASSERT(strlen(expect_body) == parser.r.body_length); GPR_ASSERT(0 == memcmp(expect_body, parser.r.body, parser.r.body_length)); } else { GPR_ASSERT(parser.r.body_length == 0); } va_start(args, expect_body); i = 0; for (;;) { char *expect_key; char *expect_value; expect_key = va_arg(args, char *); if (!expect_key) break; GPR_ASSERT(i < parser.r.hdr_count); expect_value = va_arg(args, char *); GPR_ASSERT(expect_value); GPR_ASSERT(0 == strcmp(expect_key, parser.r.hdrs[i].key)); GPR_ASSERT(0 == strcmp(expect_value, parser.r.hdrs[i].value)); i++; } va_end(args); GPR_ASSERT(i == parser.r.hdr_count); grpc_httpcli_parser_destroy(&parser); gpr_free(slices); }
static void on_read(grpc_exec_ctx *exec_ctx, void *user_data, bool success) { internal_request *req = user_data; size_t i; for (i = 0; i < req->incoming.count; i++) { if (GPR_SLICE_LENGTH(req->incoming.slices[i])) { req->have_read_byte = 1; if (!grpc_httpcli_parser_parse(&req->parser, req->incoming.slices[i])) { finish(exec_ctx, req, 0); return; } } } if (success) { do_read(exec_ctx, req); } else if (!req->have_read_byte) { next_address(exec_ctx, req); } else { finish(exec_ctx, req, grpc_httpcli_parser_eof(&req->parser)); } }