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 )