Net-Curl
view release on metacpan or search on metacpan
Curl_Easy_setopt.c view on Meta::CPAN
/* vim: ts=4:sw=4:ft=xs:fdm=marker
*
* Copyright 2011-2015 (C) Przemyslaw Iskra <sparky at pld-linux.org>
*
* Loosely based on code by Cris Bailiff <c.bailiff+curl at devsecure.com>,
* and subsequent fixes by other contributors.
*/
static void
perl_curl_easy_setopt_long( pTHX_ perl_curl_easy_t *easy, long option,
SV *value )
{
CURLcode ret = CURLE_OK;
long value_num = 0;
if ( SvOK( value ) )
value_num = (long) SvIV( value );
ret = curl_easy_setopt( easy->handle, option, value_num );
EASY_DIE( ret );
}
static void
perl_curl_easy_setopt_function( pTHX_ perl_curl_easy_t *easy, long option,
SV *value )
{
int cbnum = CB_EASY_LAST;
int dataopt = 0;
void *funcptr = NULL;
switch ( option ) {
case CURLOPT_WRITEFUNCTION:
/* function registered already */
cbnum = CB_EASY_WRITE;
break;
case CURLOPT_READFUNCTION:
/* function registered already */
cbnum = CB_EASY_READ;
break;
case CURLOPT_HEADERFUNCTION:
funcptr = cb_easy_header;
dataopt = CURLOPT_WRITEHEADER;
cbnum = CB_EASY_HEADER;
break;
case CURLOPT_PROGRESSFUNCTION:
funcptr = cb_easy_progress;
dataopt = CURLOPT_PROGRESSDATA;
cbnum = CB_EASY_PROGRESS;
break;
#ifdef CURLOPT_XFERINFODATA
# ifdef CURLOPT_XFERINFOFUNCTION
case CURLOPT_XFERINFOFUNCTION:
funcptr = cb_easy_xferinfo;
dataopt = CURLOPT_XFERINFODATA;
cbnum = CB_EASY_XFERINFO;
break;
# endif
#endif
case CURLOPT_DEBUGFUNCTION:
funcptr = cb_easy_debug;
dataopt = CURLOPT_DEBUGDATA;
cbnum = CB_EASY_DEBUG;
break;
case CURLOPT_IOCTLFUNCTION:
funcptr = cb_easy_ioctl;
dataopt = CURLOPT_IOCTLDATA;
cbnum = CB_EASY_IOCTL;
break;
#ifdef CURLOPT_SEEKDATA
# ifdef CURLOPT_SEEKFUNCTION
case CURLOPT_SEEKFUNCTION:
funcptr = cb_easy_seek;
dataopt = CURLOPT_SEEKDATA;
cbnum = CB_EASY_SEEK;
break;
# endif
#endif
#ifdef CURLOPT_SOCKOPTDATA
# ifdef CURLOPT_SOCKOPTFUNCTION
case CURLOPT_SOCKOPTFUNCTION:
funcptr = cb_easy_sockopt;
dataopt = CURLOPT_SOCKOPTDATA;
cbnum = CB_EASY_SOCKOPT;
break;
# endif
#endif
#ifdef CURLOPT_OPENSOCKETDATA
# ifdef CURLOPT_OPENSOCKETFUNCTION
case CURLOPT_OPENSOCKETFUNCTION:
funcptr = cb_easy_opensocket;
dataopt = CURLOPT_OPENSOCKETDATA;
cbnum = CB_EASY_OPENSOCKET;
break;
# endif
#endif
#ifdef CURLOPT_CLOSESOCKETDATA
# ifdef CURLOPT_CLOSESOCKETFUNCTION
case CURLOPT_CLOSESOCKETFUNCTION:
funcptr = cb_easy_closesocket;
dataopt = CURLOPT_CLOSESOCKETDATA;
cbnum = CB_EASY_CLOSESOCKET;
break;
Curl_Easy_setopt.c view on Meta::CPAN
break;
# endif
# ifdef CURLOPT_CHUNK_END_FUNCTION
case CURLOPT_CHUNK_END_FUNCTION:
funcptr = cb_easy_chunk_end;
dataopt = CURLOPT_CHUNK_DATA;
cbnum = CB_EASY_CHUNK_END;
break;
# endif
#endif
#ifdef CURLOPT_FNMATCH_DATA
# ifdef CURLOPT_FNMATCH_FUNCTION
case CURLOPT_FNMATCH_FUNCTION:
funcptr = cb_easy_fnmatch;
dataopt = CURLOPT_FNMATCH_DATA;
cbnum = CB_EASY_FNMATCH;
break;
# endif
#endif
#ifdef CURLOPT_SSH_KEYDATA
# ifdef CURLOPT_SSH_KEYFUNCTION
case CURLOPT_SSH_KEYFUNCTION:
funcptr = cb_easy_sshkey;
dataopt = CURLOPT_SSH_KEYDATA;
cbnum = CB_EASY_SSHKEY;
break;
# endif
#endif
default:
croak( "unrecognized function option %ld", option );
}
if ( cbnum != CB_EASY_LAST )
SvREPLACE( easy->cb[ cbnum ].func, value );
if ( dataopt ) {
CURLcode ret1, ret2;
ret1 = curl_easy_setopt( easy->handle, option,
SvOK( value ) ? funcptr : NULL );
ret2 = curl_easy_setopt( easy->handle, dataopt,
SvOK( value ) ? easy : NULL );
EASY_DIE( ret1 ? ret1 : ret2 );
}
}
static long
perl_curl_easy_setopt_functiondata( pTHX_ perl_curl_easy_t *easy, long option,
SV *value )
{
int cbnum = CB_EASY_LAST;
CURLcode ret = CURLE_OK;
switch ( option ) {
case CURLOPT_FILE:
cbnum = CB_EASY_WRITE;
break;
case CURLOPT_INFILE:
cbnum = CB_EASY_READ;
break;
case CURLOPT_WRITEHEADER:
/* cb_easy_header has default writer function,
* but no default destination */
{
CURLcode ret2;
ret = curl_easy_setopt( easy->handle, CURLOPT_HEADERFUNCTION,
SvOK( value ) ? cb_easy_header : NULL );
ret2 = curl_easy_setopt( easy->handle, option,
SvOK( value ) ? easy : NULL );
if ( ret == CURLE_OK )
ret = ret2;
}
cbnum = CB_EASY_HEADER;
break;
case CURLOPT_PROGRESSDATA:
cbnum = CB_EASY_PROGRESS;
#ifdef CURLOPT_XFERINFODATA
/* duplicate data for CB_EASY_XFERINFO since CURLOPT_XFERINFODATA is an alias for CURLOPT_PROGRESSDATA */
SvREPLACE( easy->cb[ CB_EASY_XFERINFO ].data, value );
#endif
break;
case CURLOPT_DEBUGDATA:
cbnum = CB_EASY_DEBUG;
break;
case CURLOPT_IOCTLDATA:
cbnum = CB_EASY_IOCTL;
break;
#ifdef CURLOPT_SEEKDATA
case CURLOPT_SEEKDATA:
cbnum = CB_EASY_SEEK;
break;
#endif
#ifdef CURLOPT_SOCKOPTDATA
case CURLOPT_SOCKOPTDATA:
cbnum = CB_EASY_SOCKOPT;
break;
#endif
#ifdef CURLOPT_OPENSOCKETDATA
case CURLOPT_OPENSOCKETDATA:
cbnum = CB_EASY_OPENSOCKET;
break;
#endif
#ifdef CURLOPT_CLOSESOCKETDATA
case CURLOPT_CLOSESOCKETDATA:
cbnum = CB_EASY_CLOSESOCKET;
break;
#endif
#ifdef CURLOPT_INTERLEAVEDATA
case CURLOPT_INTERLEAVEDATA:
# ifdef CURLOPT_INTERLEAVEFUNCTION
/* cb_easy_interleave has default writer function,
* but no default destination */
{
CURLcode ret2;
ret = curl_easy_setopt( easy->handle, CURLOPT_INTERLEAVEFUNCTION,
SvOK( value ) ? cb_easy_interleave : NULL );
ret2 = curl_easy_setopt( easy->handle, option,
SvOK( value ) ? easy : NULL );
if ( ret == CURLE_OK )
ret = ret2;
( run in 1.545 second using v1.01-cache-2.11-cpan-39bf76dae61 )