MODULE = APR::Request PACKAGE = APR::Request SV* encode(in) SV *in PREINIT: STRLEN len; char *src; CODE: src = SvPV(in, len); RETVAL = newSV(3 * len + 1); SvCUR_set(RETVAL, apreq_encode(SvPVX(RETVAL), src, len)); SvPOK_on(RETVAL); OUTPUT: RETVAL SV* decode(in) SV *in PREINIT: STRLEN len; apr_size_t dlen; char *src; CODE: src = SvPV(in, len); RETVAL = newSV(len + 1); apreq_decode(SvPVX(RETVAL), &dlen, src, len); /*XXX needs error-handling */ SvCUR_set(RETVAL, dlen); SvPOK_on(RETVAL); OUTPUT: RETVAL SV* read_limit(req, val=NULL) APR::Request req SV *val PREINIT: /* nada */ CODE: if (items == 1) { apr_status_t s; apr_uint64_t bytes; s = apreq_read_limit_get(req, &bytes); if (s != APR_SUCCESS) { if (!sv_derived_from(ST(0), ERROR_CLASS)) { SV *obj = apreq_xs_sv2object(aTHX_ ST(0), HANDLE_CLASS, 'r'); apreq_xs_croak(aTHX_ newHV(), obj, s, "APR::Request::read_limit", ERROR_CLASS); } else RETVAL = &PL_sv_undef; } else { RETVAL = newSVuv(bytes); } } else { apr_status_t s = apreq_read_limit_set(req, SvUV(val)); if (s != APR_SUCCESS) { if (GIMME_V == G_VOID && !sv_derived_from(ST(0), ERROR_CLASS)) { SV *obj = apreq_xs_sv2object(aTHX_ ST(0), HANDLE_CLASS, 'r'); apreq_xs_croak(aTHX_ newHV(), obj, s, "APR::Request::read_limit", ERROR_CLASS); } else RETVAL = &PL_sv_no; } else { RETVAL = &PL_sv_yes; } } OUTPUT: RETVAL SV* brigade_limit(req, val=NULL) APR::Request req SV *val PREINIT: /* nada */ CODE: if (items == 1) { apr_status_t s; apr_size_t bytes; s = apreq_brigade_limit_get(req, &bytes); if (s != APR_SUCCESS) { if (!sv_derived_from(ST(0), ERROR_CLASS)) { SV *obj = apreq_xs_sv2object(aTHX_ ST(0), HANDLE_CLASS, 'r'); apreq_xs_croak(aTHX_ newHV(), obj, s, "APR::Request::brigade_limit", ERROR_CLASS); } else RETVAL = &PL_sv_undef; } else { RETVAL = newSVuv(bytes); } } else { apr_status_t s = apreq_brigade_limit_set(req, SvUV(val)); if (s != APR_SUCCESS) { if (GIMME_V == G_VOID && !sv_derived_from(ST(0), ERROR_CLASS)) { SV *obj = apreq_xs_sv2object(aTHX_ ST(0), HANDLE_CLASS, 'r'); apreq_xs_croak(aTHX_ newHV(), obj, s, "APR::Request::brigade_limit", ERROR_CLASS); } else RETVAL = &PL_sv_no; } else { RETVAL = &PL_sv_yes; } } OUTPUT: RETVAL SV* temp_dir(req, val=NULL) APR::Request req SV *val PREINIT: /* nada */ CODE: if (items == 1) { apr_status_t s; const char *path; s = apreq_temp_dir_get(req, &path); if (s != APR_SUCCESS) { if (!sv_derived_from(ST(0), ERROR_CLASS)) { SV *obj = apreq_xs_sv2object(aTHX_ ST(0), HANDLE_CLASS, 'r'); apreq_xs_croak(aTHX_ newHV(), obj, s, "APR::Request::temp_dir", ERROR_CLASS); } else RETVAL = &PL_sv_undef; } else { RETVAL = (path == NULL) ? &PL_sv_undef : newSVpv(path, 0); } } else { apr_status_t s = apreq_temp_dir_set(req, SvPV_nolen(val)); if (s != APR_SUCCESS) { if (GIMME_V == G_VOID && !sv_derived_from(ST(0), ERROR_CLASS)) { SV *obj = apreq_xs_sv2object(aTHX_ ST(0), HANDLE_CLASS, 'r'); apreq_xs_croak(aTHX_ newHV(), obj, s, "APR::Request::temp_dir", ERROR_CLASS); } else RETVAL = &PL_sv_no; } else { RETVAL = &PL_sv_yes; } } OUTPUT: RETVAL SV* jar_status(req) APR::Request req PREINIT: const apr_table_t *t; CODE: RETVAL = apreq_xs_error2sv(aTHX_ apreq_jar(req, &t)); OUTPUT: RETVAL SV* args_status(req) APR::Request req PREINIT: const apr_table_t *t; CODE: RETVAL = apreq_xs_error2sv(aTHX_ apreq_args(req, &t)); OUTPUT: RETVAL SV* body_status(req) APR::Request req PREINIT: const apr_table_t *t; CODE: RETVAL = apreq_xs_error2sv(aTHX_ apreq_body(req, &t)); OUTPUT: RETVAL SV* disable_uploads(req) APR::Request req PREINIT: apreq_hook_t *h; apr_status_t s; CODE: h = apreq_hook_make(req->pool, apreq_hook_disable_uploads, NULL, NULL); s = apreq_hook_add(req, h); RETVAL = apreq_xs_error2sv(aTHX_ s); OUTPUT: RETVAL void upload_hook(obj, sub) SV *obj SV *sub PREINIT: struct hook_ctx *ctx; IV iv; apreq_handle_t *req; CODE: obj = apreq_xs_sv2object(aTHX_ obj, "APR::Request", 'r'); iv = SvIVX(obj); req = INT2PTR(apreq_handle_t *, iv); ctx = apr_palloc(req->pool, sizeof *ctx); ctx->hook = newSVsv(sub); ctx->bucket_data = newSV(8000); ctx->parent = SvREFCNT_inc(obj); SvTAINTED_on(ctx->bucket_data); #ifdef USE_ITHREADS ctx->perl = aTHX; #endif apreq_hook_add(req, apreq_hook_make(req->pool, apreq_xs_upload_hook, NULL, ctx)); apr_pool_cleanup_register(req->pool, ctx, upload_hook_cleanup, upload_hook_cleanup); APR::Pool pool(req) APR::Request req CODE: RETVAL = req->pool; OUTPUT: RETVAL APR::BucketAlloc bucket_alloc(req) APR::Request req CODE: RETVAL = req->bucket_alloc; OUTPUT: RETVAL MODULE = APR::Request::Param PACKAGE = APR::Request::Param::Table SV * uploads(t, pool) APR::Request::Param::Table t APR::Pool pool PREINIT: SV *obj = apreq_xs_sv2object(aTHX_ ST(0), PARAM_TABLE_CLASS, 't'); SV *parent = apreq_xs_sv2object(aTHX_ ST(0), HANDLE_CLASS, 'r'); MAGIC *mg = mg_find(obj, PERL_MAGIC_ext); CODE: RETVAL = apreq_xs_param_table2sv(aTHX_ apreq_uploads(t, pool), HvNAME(SvSTASH(obj)), parent, mg->mg_ptr, mg->mg_len); OUTPUT: RETVAL MODULE = APR::Request::Param PACKAGE = APR::Request::Param::Table SV * param_class(t, subclass=&PL_sv_undef) APR::Request::Param::Table t SV *subclass PREINIT: SV *obj = apreq_xs_sv2object(aTHX_ ST(0), PARAM_TABLE_CLASS, 't'); MAGIC *mg = mg_find(obj, PERL_MAGIC_ext); char *curclass = mg->mg_ptr; CODE: if (items == 2) { if (!SvOK(subclass)) { mg->mg_ptr = NULL; mg->mg_len = 0; } else if (!sv_derived_from(subclass, PARAM_CLASS)) { Perl_croak(aTHX_ "Usage: " PARAM_TABLE_CLASS "::param_class($table, $class): " "class %s is not derived from " PARAM_CLASS, SvPV_nolen(subclass)); } else { STRLEN len; mg->mg_ptr = savepv(SvPV(subclass, len)); mg->mg_len = len; } if (curclass != NULL) Safefree(curclass); XSRETURN(1); } RETVAL = (curclass == NULL) ? &PL_sv_undef : newSVpv(curclass, 0); OUTPUT: RETVAL MODULE = APR::Request::Cookie PACKAGE = APR::Request::Cookie::Table SV * cookie_class(t, subclass=&PL_sv_undef) APR::Request::Cookie::Table t SV *subclass PREINIT: SV *obj = apreq_xs_sv2object(aTHX_ ST(0), COOKIE_TABLE_CLASS, 't'); MAGIC *mg = mg_find(obj, PERL_MAGIC_ext); char *curclass = mg->mg_ptr; CODE: if (items == 2) { if (!SvOK(subclass)) { mg->mg_ptr = NULL; mg->mg_len = 0; } else if (!sv_derived_from(subclass, COOKIE_CLASS)) { Perl_croak(aTHX_ "Usage: " COOKIE_TABLE_CLASS "::cookie_class($table, $class): " "class %s is not derived from " COOKIE_CLASS, SvPV_nolen(subclass)); } else { STRLEN len; mg->mg_ptr = savepv(SvPV(subclass, len)); mg->mg_len = len; } if (curclass != NULL) Safefree(curclass); XSRETURN(1); } RETVAL = (curclass == NULL) ? &PL_sv_undef : newSVpv(curclass, 0); OUTPUT: RETVAL MODULE = APR::Request PACKAGE = APR::Request::Custom APR::Request handle(class, pool, query_string, cookie, parser, read_limit, in) apreq_xs_subclass_t class APR::Pool pool char *query_string char *cookie APR::Request::Parser parser UV read_limit APR::Brigade in PREINIT: SV *parent = SvRV(ST(1)); CODE: RETVAL = apreq_handle_custom(pool, query_string, cookie, parser, read_limit, in); OUTPUT: RETVAL BOOT: { apr_version_t version; apr_version(&version); if (version.major != APR_MAJOR_VERSION) Perl_croak(aTHX_ "Can't load module APR::Request : " "wrong libapr major version " "(expected %d, saw %d)", APR_MAJOR_VERSION, version.major); }