⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 apr_uri.c

📁 Apache官方在今天放出产品系列2.2的最新版本2.2.11的源码包 最流行的HTTP服务器软件之一
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 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. *//* * apr_uri.c: URI related utility things *  */#include <stdlib.h>#include "apu.h"#include "apr.h"#include "apr_general.h"#include "apr_strings.h"#define APR_WANT_STRFUNC#include "apr_want.h"#include "apr_uri.h"typedef struct schemes_t schemes_t;/** Structure to store various schemes and their default ports */struct schemes_t {    /** The name of the scheme */    const char *name;    /** The default port for the scheme */    apr_port_t default_port;};/* Some WWW schemes and their default ports; this is basically /etc/services *//* This will become global when the protocol abstraction comes *//* As the schemes are searched by a linear search, *//* they are sorted by their expected frequency */static schemes_t schemes[] ={    {"http",     APR_URI_HTTP_DEFAULT_PORT},    {"ftp",      APR_URI_FTP_DEFAULT_PORT},    {"https",    APR_URI_HTTPS_DEFAULT_PORT},    {"gopher",   APR_URI_GOPHER_DEFAULT_PORT},    {"ldap",     APR_URI_LDAP_DEFAULT_PORT},    {"nntp",     APR_URI_NNTP_DEFAULT_PORT},    {"snews",    APR_URI_SNEWS_DEFAULT_PORT},    {"imap",     APR_URI_IMAP_DEFAULT_PORT},    {"pop",      APR_URI_POP_DEFAULT_PORT},    {"sip",      APR_URI_SIP_DEFAULT_PORT},    {"rtsp",     APR_URI_RTSP_DEFAULT_PORT},    {"wais",     APR_URI_WAIS_DEFAULT_PORT},    {"z39.50r",  APR_URI_WAIS_DEFAULT_PORT},    {"z39.50s",  APR_URI_WAIS_DEFAULT_PORT},    {"prospero", APR_URI_PROSPERO_DEFAULT_PORT},    {"nfs",      APR_URI_NFS_DEFAULT_PORT},    {"tip",      APR_URI_TIP_DEFAULT_PORT},    {"acap",     APR_URI_ACAP_DEFAULT_PORT},    {"telnet",   APR_URI_TELNET_DEFAULT_PORT},    {"ssh",      APR_URI_SSH_DEFAULT_PORT},    { NULL, 0xFFFF }     /* unknown port */};APU_DECLARE(apr_port_t) apr_uri_port_of_scheme(const char *scheme_str){    schemes_t *scheme;    if (scheme_str) {        for (scheme = schemes; scheme->name != NULL; ++scheme) {            if (strcasecmp(scheme_str, scheme->name) == 0) {                return scheme->default_port;            }        }    }    return 0;}/* Unparse a apr_uri_t structure to an URI string. * Optionally suppress the password for security reasons. */APU_DECLARE(char *) apr_uri_unparse(apr_pool_t *p,                                     const apr_uri_t *uptr,                                     unsigned flags){    char *ret = "";    /* If suppressing the site part, omit both user name & scheme://hostname */    if (!(flags & APR_URI_UNP_OMITSITEPART)) {        /* Construct a "user:password@" string, honoring the passed         * APR_URI_UNP_ flags: */        if (uptr->user || uptr->password) {            ret = apr_pstrcat(p,                      (uptr->user     && !(flags & APR_URI_UNP_OMITUSER))                          ? uptr->user : "",                      (uptr->password && !(flags & APR_URI_UNP_OMITPASSWORD))                          ? ":" : "",                      (uptr->password && !(flags & APR_URI_UNP_OMITPASSWORD))                          ? ((flags & APR_URI_UNP_REVEALPASSWORD)                              ? uptr->password : "XXXXXXXX")                          : "",                      ((uptr->user     && !(flags & APR_URI_UNP_OMITUSER)) ||                       (uptr->password && !(flags & APR_URI_UNP_OMITPASSWORD)))                          ? "@" : "",                       NULL);        }        /* Construct scheme://site string */        if (uptr->hostname) {            int is_default_port;            const char *lbrk = "", *rbrk = "";            if (strchr(uptr->hostname, ':')) { /* v6 literal */                lbrk = "[";                rbrk = "]";            }            is_default_port =                (uptr->port_str == NULL ||                 uptr->port == 0 ||                 uptr->port == apr_uri_port_of_scheme(uptr->scheme));            ret = apr_pstrcat(p, "//", ret, lbrk, uptr->hostname, rbrk,                        is_default_port ? "" : ":",                        is_default_port ? "" : uptr->port_str,                        NULL);        }	if (uptr->scheme) {	    ret = apr_pstrcat(p, uptr->scheme, ":", ret, NULL);	}    }        /* Should we suppress all path info? */    if (!(flags & APR_URI_UNP_OMITPATHINFO)) {        /* Append path, query and fragment strings: */        ret = apr_pstrcat(p,                          ret,                          (uptr->path)                              ? uptr->path : "",                          (uptr->query    && !(flags & APR_URI_UNP_OMITQUERY))                              ? "?" : "",                          (uptr->query    && !(flags & APR_URI_UNP_OMITQUERY))                              ? uptr->query : "",                          (uptr->fragment && !(flags & APR_URI_UNP_OMITQUERY))                              ? "#" : NULL,                          (uptr->fragment && !(flags & APR_URI_UNP_OMITQUERY))                              ? uptr->fragment : NULL,                          NULL);    }    return ret;}/* Here is the hand-optimized parse_uri_components().  There are some wild * tricks we could pull in assembly language that we don't pull here... like we * can do word-at-time scans for delimiter characters using the same technique * that fast memchr()s use.  But that would be way non-portable. -djg *//* We have a apr_table_t that we can index by character and it tells us if the * character is one of the interesting delimiters.  Note that we even get * compares for NUL for free -- it's just another delimiter. */#define T_COLON           0x01        /* ':' */#define T_SLASH           0x02        /* '/' */#define T_QUESTION        0x04        /* '?' */#define T_HASH            0x08        /* '#' */#define T_NUL             0x80        /* '\0' */#if APR_CHARSET_EBCDIC/* Delimiter table for the EBCDIC character set */static const unsigned char uri_delims[256] = {    T_NUL,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,T_SLASH,0,0,0,0,0,0,0,0,0,0,0,0,0,T_QUESTION,    0,0,0,0,0,0,0,0,0,0,T_COLON,T_HASH,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};#else/* Delimiter table for the ASCII character set */static const unsigned char uri_delims[256] = {    T_NUL,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,T_HASH,0,0,0,0,0,0,0,0,0,0,0,T_SLASH,    0,0,0,0,0,0,0,0,0,0,T_COLON,0,0,0,0,T_QUESTION,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};#endif/* it works like this:    if (uri_delims[ch] & NOTEND_foobar) {        then we're not at a delimiter for foobar    }*//* Note that we optimize the scheme scanning here, we cheat and let the

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -