LIB_EXPORT rc_t CC KCurlRequestPerform( struct KCurlRequest *self, KDataBuffer * buffer ) { CURLcode rcc; ReadContext ctx; rc_t rc = 0; if ( buffer == NULL ) return RC( rcNS, rcFile, rcReading, rcParam, rcNull ); memset ( buffer, 0, sizeof * buffer ); if ( self == NULL ) return RC( rcNS, rcFile, rcReading, rcSelf, rcNull ); rc = KDataBufferMakeBytes ( buffer, 0 ); if ( rc != 0 ) return rc; ctx.buffer = buffer; ctx.num_read = 0; rcc = self->kns_mgr->curl_easy_setopt_fkt( self->curl_handle, CURLOPT_WRITEDATA, (void *)&ctx ); if ( rcc != CURLE_OK ) { rc = RC( rcFS, rcFile, rcConstructing, rcFileDesc, rcInvalid ); LOGERR( klogErr, rc, "curl_easy_setopt( CURLOPT_WRITEDATA ) failed" ); } if ( rc == 0 ) { CURLcode rcc = self->kns_mgr->curl_easy_setopt_fkt( self->curl_handle, CURLOPT_WRITEFUNCTION, KCurlFileCallback ); if ( rcc != CURLE_OK ) { rc = RC( rcFS, rcFile, rcConstructing, rcFileDesc, rcInvalid ); LOGERR( klogErr, rc, "curl_easy_setopt( CURLOPT_WRITEFUNCTION ) failed" ); } } if ( rc == 0 ) rc = set_curl_long_option( self, CURLOPT_FOLLOWLOCATION, 1, "CURLOPT_FOLLOWLOCATION" ); if ( rc == 0 ) rc = KCurlRequestSetFields( self ); if ( rc == 0 ) rc = perform( self->kns_mgr, self->curl_handle, "POST request" ); if ( rc == 0 ) rc = check_response_code( self->kns_mgr, self->curl_handle, "POST request" ); if ( rc == 0 ) { buffer->elem_count = ctx.num_read; ( ( uint8_t * )buffer->base )[ ctx.num_read ] = 0; } return rc; }
/* * Checks that the response finished successfully * with a valid response status and code. */ void check_response(churl_context* context) { check_response_code(context); check_response_status(context); }