示例#1
0
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;
}
示例#2
0
/*
 * 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);
}