/* * Wrapper for libchurl */ static void process_request(ClientContext* client_context, char *uri) { size_t n = 0; char buffer[RAW_BUF_SIZE]; print_http_headers(client_context->http_headers); client_context->handle = churl_init_download(uri, client_context->http_headers); memset(buffer, 0, RAW_BUF_SIZE); resetStringInfo(&(client_context->the_rest_buf)); /* * This try-catch ensures that in case of an exception during the "communication with PXF and the accumulation of * PXF data in client_context->the_rest_buf", we still get to terminate the libcurl connection nicely and avoid * leaving the PXF server connection hung. */ PG_TRY(); { /* read some bytes to make sure the connection is established */ churl_read_check_connectivity(client_context->handle); while ((n = churl_read(client_context->handle, buffer, sizeof(buffer))) != 0) { appendBinaryStringInfo(&(client_context->the_rest_buf), buffer, n); memset(buffer, 0, RAW_BUF_SIZE); } churl_cleanup(client_context->handle, false); } PG_CATCH(); { if (client_context->handle) churl_cleanup(client_context->handle, true); PG_RE_THROW(); } PG_END_TRY(); }
void cleanup_churl_handle(gphadoop_context* context) { churl_cleanup(context->churl_handle, false); context->churl_handle = NULL; }