#include "mod_perl.h" #include "mod_perl_xs.h" typedef struct { uri_components uri; pool *pool; request_rec *r; char *path_info; } XS_Apache__URI; typedef XS_Apache__URI * Apache__URI; MODULE = Apache::URI PACKAGE = Apache PROTOTYPES: DISABLE BOOT: items = items; /*avoid warning*/ Apache::URI parsed_uri(r) Apache r CODE: RETVAL = (Apache__URI)safemalloc(sizeof(XS_Apache__URI)); RETVAL->uri = r->parsed_uri; RETVAL->pool = r->pool; RETVAL->r = r; RETVAL->path_info = r->path_info; OUTPUT: RETVAL MODULE = Apache::URI PACKAGE = Apache::URI void DESTROY(uri) Apache::URI uri CODE: safefree(uri); Apache::URI parse(self, r, uri=NULL) SV *self Apache r const char *uri PREINIT: int self_uri = 0; CODE: self = self; /* -Wall */ RETVAL = (Apache__URI)safemalloc(sizeof(XS_Apache__URI)); if(!uri) { uri = ap_construct_url(r->pool, r->uri, r); self_uri = 1; } (void)ap_parse_uri_components(r->pool, uri, &RETVAL->uri); RETVAL->pool = r->pool; RETVAL->r = r; RETVAL->path_info = NULL; if(self_uri) RETVAL->uri.query = r->args; OUTPUT: RETVAL char * unparse(uri, flags=UNP_OMITPASSWORD) Apache::URI uri unsigned flags CODE: RETVAL = ap_unparse_uri_components(uri->pool, &uri->uri, flags); OUTPUT: RETVAL SV * rpath(uri) Apache::URI uri CODE: RETVAL = Nullsv; if(uri->path_info) { int uri_len = strlen(uri->uri.path); int n = strlen(uri->path_info); int set = uri_len - n; if(set > 0) RETVAL = newSVpv(uri->uri.path, set); } else { if (uri->uri.path) { RETVAL = newSVpv(uri->uri.path, 0); } } OUTPUT: RETVAL char * scheme(uri, ...) Apache::URI uri CODE: get_set_PVp(uri->uri.scheme,uri->pool); OUTPUT: RETVAL char * hostinfo(uri, ...) Apache::URI uri CODE: get_set_PVp(uri->uri.hostinfo,uri->pool); OUTPUT: RETVAL char * user(uri, ...) Apache::URI uri CODE: get_set_PVp(uri->uri.user,uri->pool); OUTPUT: RETVAL char * password(uri, ...) Apache::URI uri CODE: get_set_PVp(uri->uri.password,uri->pool); OUTPUT: RETVAL char * hostname(uri, ...) Apache::URI uri CODE: get_set_PVp(uri->uri.hostname,uri->pool); OUTPUT: RETVAL char * path(uri, ...) Apache::URI uri CODE: get_set_PVp(uri->uri.path,uri->pool); OUTPUT: RETVAL char * query(uri, ...) Apache::URI uri CODE: get_set_PVp(uri->uri.query,uri->pool); OUTPUT: RETVAL char * fragment(uri, ...) Apache::URI uri CODE: get_set_PVp(uri->uri.fragment,uri->pool); OUTPUT: RETVAL char * port(uri, ...) Apache::URI uri CODE: get_set_PVp(uri->uri.port_str,uri->pool); if (items > 1) { uri->uri.port = (int)SvIV(ST(1)); } OUTPUT: RETVAL char * path_info(uri, ...) Apache::URI uri CODE: get_set_PVp(uri->path_info,uri->pool); OUTPUT: RETVAL