blob: 59589aadba609d7e8e00649e995d70462a255ea6 [file] [log] [blame]
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
static MP_INLINE
char *mpxs_apr_uri_unparse(pTHX_
apr_uri_t *uptr,
unsigned flags)
{
/* apr =< 0.9.2-dev segfaults if hostname is set, but scheme is not.
* apr >= 0.9.2 simply uses "", which will force the user to set scheme
* since apr_uri_unparse is protocol-agnostic, it doesn't use
* 'http' as the default fallback anymore. so we use the same solution
*/
#if APR_MAJOR_VERSION == 0 && APR_MINOR_VERSION == 9 && \
(APR_PATCH_VERSION < 2 || APR_PATCH_VERSION == 2 && defined APR_IS_DEV_VERSION)
if (uptr->hostname && !uptr->scheme) {
uptr->scheme = "";
}
#endif
return apr_uri_unparse(((modperl_uri_t *)uptr)->pool,
uptr, flags);
}
static MP_INLINE
SV *mpxs_apr_uri_parse(pTHX_ SV *classname, SV *p_sv, const char *uri_string)
{
SV *uri_sv;
apr_pool_t *p = mp_xs_sv2_APR__Pool(p_sv);
modperl_uri_t *uri = modperl_uri_new(p);
(void)apr_uri_parse(p, uri_string, &uri->uri);
uri_sv = sv_setref_pv(newSV(0), "APR::URI", (void*)uri);
mpxs_add_pool_magic(uri_sv, p_sv);
return uri_sv;
}
static MP_INLINE
char *mpxs_APR__URI_port(pTHX_ apr_uri_t *uri, SV *portsv)
{
char *port_str = uri->port_str;
if (portsv) {
if (SvOK(portsv)) {
STRLEN len;
char *port = SvPV(portsv, len);
uri->port_str = apr_pstrndup(((modperl_uri_t *)uri)->pool,
port, len);
uri->port = (int)SvIV(portsv);
}
else {
uri->port_str = NULL;
uri->port = 0;
}
}
return port_str;
}
static MP_INLINE
SV *mpxs_APR__URI_rpath(pTHX_ apr_uri_t *apr_uri)
{
modperl_uri_t *uri = (modperl_uri_t *)apr_uri;
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) {
return newSVpv(uri->uri.path, set);
}
}
else {
if (uri->uri.path) {
return newSVpv(uri->uri.path, 0);
}
}
return (SV *)NULL;
}
/*
* Local Variables:
* c-basic-offset: 4
* indent-tabs-mode: nil
* End:
*/