There are no available options for this view.

Parent Directory Parent Directory | Revision <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Log">Log</a> Revision <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Log">Log</a>

Revision 1.5 - (show annotations) (download) (as text)
Tue Mar 13 16:46:02 2001 UTC (16 years, 9 months ago) by jgdavidson
Branch: MAIN
CVS Tags: aolserver_v4_r0_beta_16, aolserver_v4_r0_beta_20, aolserver_v4_r0_beta_21, aolserver_v45_r0, aolserver_v4_r0_beta_3, aolserver_v4_r0_beta_13, aolserver_v4_r0_beta_1, aolserver_v4_r0_beta_7, aolserver_v4_r0_beta_6, aolserver_v4_r0_beta_5, aolserver_v4_r0_beta_12, aolserver_v4_r0_beta_9, aolserver_v40_r10, aolserver_v4_r0_beta_11, aolserver_v4_r0_beta_19, aolserver_v4_r0_beta_18, aolserver_v40_r9, aolserver_v40_r8, aolserver_v40_r7, aolserver_v40_r6, aolserver_v40_r5, aolserver_v4_r0_beta_10, aolserver_v40_r3, aolserver_v40_r2, aolserver_v40_r1, aolserver_v40_r0, aolserver_v4_r0_beta_15, aolserver_v4_r0_beta_14, aolserver_v4_r0_beta_8, aolserver_v4_r0_beta_4, aolserver_v45_r2_rc0, aolserver_v4_r0_beta_2, aolserver_v4_r0_beta_17, aolserver_v40_r9_b2, HEAD
Branch point for: aolserver_v45_r1, aolserver_v45_r2, aolserver_v45_bp, aolserver_v40_bp
Changes since 1.4: +17 -27 lines
File MIME type: text/x-chdr
Removed various assert()'s because, better or worse, we're not asserting
things elsewhere.
1 /*
2 * The contents of this file are subject to the AOLserver Public License
3 * Version 1.1 (the "License"); you may not use this file except in
4 * compliance with the License. You may obtain a copy of the License at
5 * http://aolserver.com/.
6 *
7 * Software distributed under the License is distributed on an "AS IS"
8 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
9 * the License for the specific language governing rights and limitations
10 * under the License.
11 *
12 * The Original Code is AOLserver Code and related documentation
13 * distributed by AOL.
14 *
15 * The Initial Developer of the Original Code is America Online,
16 * Inc. Portions created by AOL are Copyright (C) 1999 America Online,
17 * Inc. All Rights Reserved.
18 *
19 * Alternatively, the contents of this file may be used under the terms
20 * of the GNU General Public License (the "GPL"), in which case the
21 * provisions of GPL are applicable instead of those above. If you wish
22 * to allow use of your version of this file only under the terms of the
23 * GPL and not to allow others to use your version of this file under the
24 * License, indicate your decision by deleting the provisions above and
25 * replace them with the notice and other provisions required by the GPL.
26 * If you do not delete the provisions above, a recipient may use your
27 * version of this file under either the License or the GPL.
28 */
29
30
31 /*
32 * url.c --
33 *
34 * <a href="/cvs/aolserver/aolserver/nsd/adpparse.c#A_Parse">Parse</a> URLs.
35 */
36
37 static const char *RCSID = "@(#) $Header: /cvsroot-fuse/aolserver/aolserver/nsd/url.c,v 1.5 2001/03/13 16:46:02 jgdavidson Exp $, compiled: " __DATE__ " " __TIME__;
38
39 #include "nsd.h"
40
41
42 /*
43 *----------------------------------------------------------------------
44 *
45 * <a href="/cvs/aolserver/aolserver/nsd/url.c#A_Ns_RelativeUrl">Ns_RelativeUrl</a> --
46 *
47 * If the url passed in is for this server, then the initial
48 * part of the URL is stripped off. e.g., on a server whose
49 * location is http://www.foo.com, <a href="/cvs/aolserver/aolserver/nsd/url.c#A_Ns_RelativeUrl">Ns_RelativeUrl</a> of
50 * "http://www.foo.com/hello" will return "/hello".
51 *
52 * Results:
53 * A pointer to the beginning of the relative url in the
54 * passed-in url, or NULL if error.
55 *
56 * Side effects:
57 * Will set errno on error.
58 *
59 *----------------------------------------------------------------------
60 */
61
62 char *
63 <a href="/cvs/aolserver/aolserver/nsd/url.c#A_Ns_RelativeUrl">Ns_RelativeUrl</a>(char *url, char *location)
64 {
65 char *v;
66
67 if (url == NULL || location == NULL) {
68 return NULL;
69 }
70
71 /*
72 * <a href="/cvs/aolserver/aolserver/nsd/str.c#A_Ns_Match">Ns_Match</a> will return the point in URL where location stops
73 * being equal to it because location ends.
74 *
75 * e.g., if location = "http://www.foo.com" and
76 * url="http://www.foo.com/a/b" then after the call,
77 * v="/a/b", or NULL if there's a mismatch.
78 */
79
80 v = <a href="/cvs/aolserver/aolserver/nsd/str.c#A_Ns_Match">Ns_Match</a>(location, url);
81 if (v != NULL) {
82 url = v;
83 }
84 while (url[0] == '/' && url[1] == '/') {
85 ++url;
86 }
87 return url;
88 }
89
90
91 /*
92 *----------------------------------------------------------------------
93 *
94 * <a href="/cvs/aolserver/aolserver/nsd/url.c#A_Ns_ParseUrl">Ns_ParseUrl</a> --
95 *
96 * <a href="/cvs/aolserver/aolserver/nsd/adpparse.c#A_Parse">Parse</a> a URL into its component parts
97 *
98 * Results:
99 * NS_OK or NS_ERROR
100 *
101 * Side effects:
102 * Pointers to the protocol, host, port, path, and "tail" (last
103 * path element) will be set by reference in the passed-in pointers.
104 * The passed-in url will be modified.
105 *
106 *----------------------------------------------------------------------
107 */
108
109 int
110 <a href="/cvs/aolserver/aolserver/nsd/url.c#A_Ns_ParseUrl">Ns_ParseUrl</a>(char *url, char **pprotocol, char **phost,
111 char **pport, char **ppath, char **ptail)
112 {
113 char *end;
114
115 *pprotocol = NULL;
116 *phost = NULL;
117 *pport = NULL;
118 *ppath = NULL;
119 *ptail = NULL;
120
121 /*
122 * Set end to the end of the protocol
123 * http://www.foo.com:8000/baz/blah/spoo.html
124 * ^
125 * +--end
126 */
127
128 end = strchr(url, ':');
129 if (end != NULL) {
130 /*
131 * There is a protocol specified. Clear out the colon.
132 * Set pprotocol to the start of the protocol, and url to
133 * the first character after the colon.
134 *
135 * http\0//www.foo.com:8000/baz/blah/spoo.html
136 * ^ ^ ^
137 * | | +-- url
138 * | +-- end
139 * +-------- *pprotocol
140 */
141
142 *end = '\0';
143 *pprotocol = url;
144 url = end + 1;
145 if ((*url == '/') &&
146 (*(url + 1) == '/')) {
147
148 /*
149 * There are two slashes, which means a host is specified.
150 * Advance url past that and set *phost.
151 *
152 * http\0//www.foo.com:8000/baz/blah/spoo.html
153 * ^ ^ ^
154 * | | +-- url, *phost
155 * | +-- end
156 * +-------- *pprotocol
157 */
158
159 url = url + 2;
160
161 *phost = url;
162
163 /*
164 * Look for a port number, which is optional.
165 */
166
167 end = strchr(url, ':');
168 if (end != NULL) {
169 /*
170 * A port was specified. Clear the colon and
171 * set *pport to the first digit.
172 *
173 * http\0//www.foo.com\08000/baz/blah/spoo.html
174 * ^ ^ ^ ^
175 * | +-- *phost | +------ url, *pport
176 * +----- *pprotocol +--- end
177 */
178
179 *end = '\0';
180 url = end + 1;
181 *pport = url;
182 }
183
184 /*
185 * Move up to the slash which starts the path/tail.
186 * Clear out the dividing slash.
187 *
188 * http\0//www.foo.com\08000\0baz/blah/spoo.html
189 * ^ ^ ^ ^ ^
190 * | | | | +-- url
191 * | +-- *phost | +-- end
192 * +----- *pprotocol +-- *pport
193 */
194
195 end = strchr(url, '/');
196 if (end == NULL) {
197 /*
198 * No path or tail specified. Return.
199 */
200
201 *ppath = "";
202 *ptail = "";
203 return NS_OK;
204 }
205 *end = '\0';
206 url = end + 1;
207 } else {
208 /*
209 * The URL must have been an odd one without a hostname.
210 * Move the URL up past the dividing slash.
211 *
212 * http\0/baz/blah/spoo.html
213 * ^ ^ ^
214 * | | +-- url
215 * | +-- end
216 * +-------- *pprotocol
217 */
218
219 url++;
220 }
221
222 /*
223 * Set the path to URL and advance to the last slash.
224 * Set ptail to the character after that, or if there is none,
225 * it becomes path and path becomes an empty string.
226 *
227 * http\0//www.foo.com\08000\0baz/blah/spoo.html
228 * ^ ^ ^ ^ ^ ^^
229 * | | | | | |+-- *ptail
230 * | | | | | +-- end
231 * | | | | +-- *ppath
232 * | +-- *phost | +-- end
233 * +----- *pprotocol +-- *pport
234 */
235
236 *ppath = url;
237 end = strrchr(url, '/');
238 if (end == NULL) {
239 *ptail = *ppath;
240 *ppath = "";
241 } else {
242 *end = '\0';
243 *ptail = end + 1;
244 }
245 } else {
246 /*
247 * This URL does not have a colon. If it begins with a slash, then
248 * separate the tail from the path, otherwise it's all tail.
249 */
250
251 if (*url == '/') {
252 url++;
253 *ppath = url;
254
255 /*
256 * Find the last slash on the right and everything after that
257 * becomes tail; if there are no slashes then it's all tail
258 * and path is an empty string.
259 */
260
261 end = strrchr(url, '/');
262 if (end == NULL) {
263 *ptail = *ppath;
264 *ppath = "";
265 } else {
266 *end = '\0';
267 *ptail = end + 1;
268 }
269 } else {
270
271 /*
272 * Just set the tail, there are no slashes.
273 */
274
275 *ptail = url;
276 }
277 }
278 return NS_OK;
279 }
280
281
282 /*
283 *----------------------------------------------------------------------
284 *
285 * <a href="/cvs/aolserver/aolserver/nsd/url.c#A_Ns_AbsoluteUrl">Ns_AbsoluteUrl</a> --
286 *
287 * Construct an URL based on baseurl but with as many parts of
288 * the incomplete url as possible.
289 *
290 * Results:
291 * NS_OK or NS_ERROR.
292 *
293 * Side effects:
294 * None.
295 *
296 *----------------------------------------------------------------------
297 */
298
299 int
300 <a href="/cvs/aolserver/aolserver/nsd/url.c#A_Ns_AbsoluteUrl">Ns_AbsoluteUrl</a>(Ns_DString *dsPtr, char *url, char *base)
301 {
302 char *protocol, *host, *port, *path, *tail, *baseprotocol,
303 *basehost, *baseport, *basepath, *basetail;
304 int status = NS_OK;
305
306 /*
307 * Copy the URL's to allow <a href="/cvs/aolserver/aolserver/nsd/url.c#A_Ns_ParseUrl">Ns_ParseUrl</a> to destory them.
308 */
309
310 url = ns_strdup(url);
311 base = ns_strdup(base);
312 <a href="/cvs/aolserver/aolserver/nsd/url.c#A_Ns_ParseUrl">Ns_ParseUrl</a>(url, &protocol, &host, &port, &path, &tail);
313 <a href="/cvs/aolserver/aolserver/nsd/url.c#A_Ns_ParseUrl">Ns_ParseUrl</a>(base, &baseprotocol, &basehost, &baseport, &basepath, &basetail);
314 if (baseprotocol == NULL || basehost == NULL || basepath == NULL) {
315 status = NS_ERROR;
316 goto done;
317 }
318 if (protocol == NULL) {
319 protocol = baseprotocol;
320 }
321 if (host == NULL) {
322 host = basehost;
323 port = baseport;
324 }
325 if (path == NULL) {
326 path = basepath;
327 }
328 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringVarAppend">Ns_DStringVarAppend</a>(dsPtr, protocol, "://", host, NULL);
329 if (port != NULL) {
330 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringVarAppend">Ns_DStringVarAppend</a>(dsPtr, ":", port, NULL);
331 }
332 if (*path == '\0') {
333 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringVarAppend">Ns_DStringVarAppend</a>(dsPtr, "/", tail, NULL);
334 } else {
335 <a href="/cvs/aolserver/aolserver/nsd/dstring.c#A_Ns_DStringVarAppend">Ns_DStringVarAppend</a>(dsPtr, "/", path, "/", tail, NULL);
336 }
337 done:
338 ns_free(url);
339 ns_free(base);
340 return status;
341 }