1251876Speter/* Licensed to the Apache Software Foundation (ASF) under one or more
2251876Speter * contributor license agreements.  See the NOTICE file distributed with
3251876Speter * this work for additional information regarding copyright ownership.
4251876Speter * The ASF licenses this file to You under the Apache License, Version 2.0
5251876Speter * (the "License"); you may not use this file except in compliance with
6251876Speter * the License.  You may obtain a copy of the License at
7251876Speter *
8251876Speter *     http://www.apache.org/licenses/LICENSE-2.0
9251876Speter *
10251876Speter * Unless required by applicable law or agreed to in writing, software
11251876Speter * distributed under the License is distributed on an "AS IS" BASIS,
12251876Speter * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13251876Speter * See the License for the specific language governing permissions and
14251876Speter * limitations under the License.
15251876Speter */
16251876Speter
17251876Speter/*
18251876Speter * apr_uri.h: External Interface of apr_uri.c
19251876Speter */
20251876Speter
21251876Speter/**
22251876Speter * @file apr_uri.h
23251876Speter * @brief APR-UTIL URI Routines
24251876Speter */
25251876Speter
26251876Speter#ifndef APR_URI_H
27251876Speter#define APR_URI_H
28251876Speter
29251876Speter#include "apu.h"
30251876Speter
31251876Speter#include "apr_network_io.h"
32251876Speter
33251876Speter#ifdef __cplusplus
34251876Speterextern "C" {
35251876Speter#endif
36251876Speter
37251876Speter/**
38251876Speter * @defgroup APR_Util_URI URI
39251876Speter * @ingroup APR_Util
40251876Speter * @{
41251876Speter */
42251876Speter
43251876Speter#define APR_URI_FTP_DEFAULT_PORT         21 /**< default FTP port */
44251876Speter#define APR_URI_SSH_DEFAULT_PORT         22 /**< default SSH port */
45251876Speter#define APR_URI_TELNET_DEFAULT_PORT      23 /**< default telnet port */
46251876Speter#define APR_URI_GOPHER_DEFAULT_PORT      70 /**< default Gopher port */
47251876Speter#define APR_URI_HTTP_DEFAULT_PORT        80 /**< default HTTP port */
48251876Speter#define APR_URI_POP_DEFAULT_PORT        110 /**< default POP port */
49251876Speter#define APR_URI_NNTP_DEFAULT_PORT       119 /**< default NNTP port */
50251876Speter#define APR_URI_IMAP_DEFAULT_PORT       143 /**< default IMAP port */
51251876Speter#define APR_URI_PROSPERO_DEFAULT_PORT   191 /**< default Prospero port */
52251876Speter#define APR_URI_WAIS_DEFAULT_PORT       210 /**< default WAIS port */
53251876Speter#define APR_URI_LDAP_DEFAULT_PORT       389 /**< default LDAP port */
54251876Speter#define APR_URI_HTTPS_DEFAULT_PORT      443 /**< default HTTPS port */
55251876Speter#define APR_URI_RTSP_DEFAULT_PORT       554 /**< default RTSP port */
56251876Speter#define APR_URI_SNEWS_DEFAULT_PORT      563 /**< default SNEWS port */
57251876Speter#define APR_URI_ACAP_DEFAULT_PORT       674 /**< default ACAP port */
58251876Speter#define APR_URI_NFS_DEFAULT_PORT       2049 /**< default NFS port */
59251876Speter#define APR_URI_TIP_DEFAULT_PORT       3372 /**< default TIP port */
60251876Speter#define APR_URI_SIP_DEFAULT_PORT       5060 /**< default SIP port */
61251876Speter
62251876Speter/** Flags passed to unparse_uri_components(): */
63251876Speter/** suppress "scheme://user\@site:port" */
64251876Speter#define APR_URI_UNP_OMITSITEPART    (1U<<0)
65251876Speter/** Just omit user */
66251876Speter#define APR_URI_UNP_OMITUSER        (1U<<1)
67251876Speter/** Just omit password */
68251876Speter#define APR_URI_UNP_OMITPASSWORD    (1U<<2)
69251876Speter/** omit "user:password\@" part */
70251876Speter#define APR_URI_UNP_OMITUSERINFO    (APR_URI_UNP_OMITUSER | \
71251876Speter                                     APR_URI_UNP_OMITPASSWORD)
72251876Speter/** Show plain text password (default: show XXXXXXXX) */
73251876Speter#define APR_URI_UNP_REVEALPASSWORD  (1U<<3)
74251876Speter/** Show "scheme://user\@site:port" only */
75251876Speter#define APR_URI_UNP_OMITPATHINFO    (1U<<4)
76251876Speter/** Omit the "?queryarg" from the path */
77251876Speter#define APR_URI_UNP_OMITQUERY       (1U<<5)
78251876Speter
79251876Speter/** @see apr_uri_t */
80251876Spetertypedef struct apr_uri_t apr_uri_t;
81251876Speter
82251876Speter/**
83251876Speter * A structure to encompass all of the fields in a uri
84251876Speter */
85251876Speterstruct apr_uri_t {
86251876Speter    /** scheme ("http"/"ftp"/...) */
87251876Speter    char *scheme;
88251876Speter    /** combined [user[:password]\@]host[:port] */
89251876Speter    char *hostinfo;
90251876Speter    /** user name, as in http://user:passwd\@host:port/ */
91251876Speter    char *user;
92251876Speter    /** password, as in http://user:passwd\@host:port/ */
93251876Speter    char *password;
94251876Speter    /** hostname from URI (or from Host: header) */
95251876Speter    char *hostname;
96251876Speter    /** port string (integer representation is in "port") */
97251876Speter    char *port_str;
98251876Speter    /** the request path (or NULL if only scheme://host was given) */
99251876Speter    char *path;
100251876Speter    /** Everything after a '?' in the path, if present */
101251876Speter    char *query;
102251876Speter    /** Trailing "#fragment" string, if present */
103251876Speter    char *fragment;
104251876Speter
105251876Speter    /** structure returned from gethostbyname() */
106251876Speter    struct hostent *hostent;
107251876Speter
108251876Speter    /** The port number, numeric, valid only if port_str != NULL */
109251876Speter    apr_port_t port;
110251876Speter
111251876Speter    /** has the structure been initialized */
112251876Speter    unsigned is_initialized:1;
113251876Speter
114251876Speter    /** has the DNS been looked up yet */
115251876Speter    unsigned dns_looked_up:1;
116251876Speter    /** has the dns been resolved yet */
117251876Speter    unsigned dns_resolved:1;
118251876Speter};
119251876Speter
120251876Speter/* apr_uri.c */
121251876Speter/**
122251876Speter * Return the default port for a given scheme.  The schemes recognized are
123251876Speter * http, ftp, https, gopher, wais, nntp, snews, and prospero
124251876Speter * @param scheme_str The string that contains the current scheme
125251876Speter * @return The default port for this scheme
126251876Speter */
127251876SpeterAPU_DECLARE(apr_port_t) apr_uri_port_of_scheme(const char *scheme_str);
128251876Speter
129251876Speter/**
130251876Speter * Unparse a apr_uri_t structure to an URI string.  Optionally
131251876Speter * suppress the password for security reasons.
132251876Speter * @param p The pool to allocate out of
133251876Speter * @param uptr All of the parts of the uri
134251876Speter * @param flags How to unparse the uri.  One of:
135251876Speter * <PRE>
136251876Speter *    APR_URI_UNP_OMITSITEPART        Suppress "scheme://user\@site:port"
137251876Speter *    APR_URI_UNP_OMITUSER            Just omit user
138251876Speter *    APR_URI_UNP_OMITPASSWORD        Just omit password
139251876Speter *    APR_URI_UNP_OMITUSERINFO        Omit "user:password\@" part
140251876Speter *    APR_URI_UNP_REVEALPASSWORD      Show plain text password (default: show XXXXXXXX)
141251876Speter *    APR_URI_UNP_OMITPATHINFO        Show "scheme://user\@site:port" only
142251876Speter *    APR_URI_UNP_OMITQUERY           Omit "?queryarg" or "#fragment"
143251876Speter * </PRE>
144251876Speter * @return The uri as a string
145251876Speter */
146251876SpeterAPU_DECLARE(char *) apr_uri_unparse(apr_pool_t *p,
147251876Speter                                    const apr_uri_t *uptr,
148251876Speter                                    unsigned flags);
149251876Speter
150251876Speter/**
151251876Speter * Parse a given URI, fill in all supplied fields of a apr_uri_t
152251876Speter * structure. This eliminates the necessity of extracting host, port,
153251876Speter * path, query info repeatedly in the modules.
154251876Speter * @param p The pool to allocate out of
155251876Speter * @param uri The uri to parse
156251876Speter * @param uptr The apr_uri_t to fill out
157251876Speter * @return APR_SUCCESS for success or error code
158251876Speter */
159251876SpeterAPU_DECLARE(apr_status_t) apr_uri_parse(apr_pool_t *p, const char *uri,
160251876Speter                                        apr_uri_t *uptr);
161251876Speter
162251876Speter/**
163251876Speter * Special case for CONNECT parsing: it comes with the hostinfo part only
164251876Speter * @param p The pool to allocate out of
165251876Speter * @param hostinfo The hostinfo string to parse
166251876Speter * @param uptr The apr_uri_t to fill out
167251876Speter * @return APR_SUCCESS for success or error code
168251876Speter */
169251876SpeterAPU_DECLARE(apr_status_t) apr_uri_parse_hostinfo(apr_pool_t *p,
170251876Speter                                                 const char *hostinfo,
171251876Speter                                                 apr_uri_t *uptr);
172251876Speter
173251876Speter/** @} */
174251876Speter#ifdef __cplusplus
175251876Speter}
176251876Speter#endif
177251876Speter
178251876Speter#endif /* APR_URI_H */
179