AnyEvent-YACurl
view release on metacpan or search on metacpan
if (value_sv && SvOK(*value_sv)) {
if (have_value)
croak("MIMEPOST: at most one of 'value' or 'file' may be provided");
have_value = 1;
STRLEN valuelen;
char *value = SvPV(*value_sv, valuelen);
curl_mime_data(part, value, valuelen);
}
}
{
SV **file_sv = hv_fetchs(entry_hv, "file", FALSE);
if (file_sv && SvOK(*file_sv)) {
if (have_value)
croak("MIMEPOST: at most one of 'value' or 'file' may be provided");
have_value = 1;
STRLEN filelen;
char *filename = SvPV(*file_sv, filelen);
curl_mime_filedata(part, filename);
}
}
if (!have_value) {
croak("MIMEPOST: one of 'value' or 'file' is required, together with 'name'");
}
}
/* If this fails, we'll still free the mimepost properly later */
result = curl_easy_setopt(request->easy, CURLOPT_MIMEPOST, request->mimepost);
break;
}
/* Don't know... */
default:
{
croak("Not sure what to do with CURL option %d", option);
break;
}
}
return result;
}
MODULE = AnyEvent::YACurl PACKAGE = AnyEvent::YACurl
PROTOTYPES: DISABLE
BOOT:
{
/* XXX: Needs a CLONE */
MY_CXT_INIT;
MY_CXT.watchset_fn = NULL;
MY_CXT.timerset_fn = NULL;
MY_CXT.curlopt = newHV();
fill_hv_with_constants(aTHX_ MY_CXT.curlopt);
curl_global_init(CURL_GLOBAL_ALL);
}
void
new(class, args)
char *class
HV *args
PPCODE:
dMY_CXT;
(void)class;
AnyEvent__YACurl *client;
Newxz(client, 1, AnyEvent__YACurl);
ST(0) = sv_newmortal();
sv_setref_pv(ST(0), "AnyEvent::YACurl", (void*)client);
/* XXX When we destroy the client, do we pass undefs to the timer/watch functions? */
client->weak_self_ref = newSVsv(ST(0));
sv_rvweaken(client->weak_self_ref);
client->multi = curl_multi_init();
curl_multi_setopt(client->multi, CURLMOPT_SOCKETFUNCTION, mcurl_socket_callback);
curl_multi_setopt(client->multi, CURLMOPT_TIMERFUNCTION, mcurl_timer_callback);
curl_multi_setopt(client->multi, CURLMOPT_SOCKETDATA, (void*)client->weak_self_ref);
curl_multi_setopt(client->multi, CURLMOPT_TIMERDATA, (void*)client->weak_self_ref);
{
hv_iterinit(args);
HE *iterentry;
while ((iterentry = hv_iternext(args)) != NULL) {
long opt;
int opt_from_str;
SV *key = HeSVKEY_force(iterentry);
opt = option_from_sv_or_croak(aTHX_ aMY_CXT_ key, HeHASH(iterentry), &opt_from_str);
switch (opt) {
/* Longs */
case CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE:
case CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE:
case CURLMOPT_MAX_HOST_CONNECTIONS:
case CURLMOPT_MAX_PIPELINE_LENGTH:
case CURLMOPT_MAX_TOTAL_CONNECTIONS:
case CURLMOPT_MAXCONNECTS:
case CURLMOPT_PIPELINING:
{
long value = SvIV(HeVAL(iterentry));
CURLMcode mcode = curl_multi_setopt(client->multi, opt, value);
if (mcode != CURLM_OK) {
croak("Failed to set %d (%s): %s", opt, SvPV_nolen(key), curl_multi_strerror(mcode));
}
break;
}
/* String arrays */
case CURLMOPT_PIPELINING_SITE_BL:
case CURLMOPT_PIPELINING_SERVER_BL:
{
char **strings;
if (!SvROK(HeVAL(iterentry)) || SvTYPE(SvRV(HeVAL(iterentry))) != SVt_PVAV) {
( run in 1.246 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )