[Gd-chatter] r11736 - trunk/libraries/uri
turbo24prg at gwydiondylan.org
turbo24prg at gwydiondylan.org
Wed Mar 19 12:58:20 CET 2008
Author: turbo24prg
Date: Wed Mar 19 12:58:19 2008
New Revision: 11736
Modified:
trunk/libraries/uri/uri.dylan
Log:
Job: minor
use list for multiple values for one key
Modified: trunk/libraries/uri/uri.dylan
==============================================================================
--- trunk/libraries/uri/uri.dylan (original)
+++ trunk/libraries/uri/uri.dylan Wed Mar 19 12:58:19 2008
@@ -23,7 +23,9 @@
define class <url> (<uri>) end;
-define method uri-authority (uri :: <uri>) => (result :: <string>);
+define method uri-authority
+ (uri :: <uri>)
+ => (result :: <string>);
let result = "";
unless (empty?(uri.uri-userinfo))
result := concatenate(result, percent-encode(#"userinfo", uri.uri-userinfo), "@");
@@ -63,7 +65,9 @@
= compile-regex("^(([^:/?#]+):)?(//((([^/?#]*)@)?([^/?#:]*)(:([^/?#]*))?))?([^?#]*)"
"(\\?([^#]*))?(#(.*))?");
-define method parse-uri-as (class :: subclass(<uri>), uri :: <string>) => (result :: <uri>);
+define method parse-uri-as
+ (class :: subclass(<uri>), uri :: <string>)
+ => (result :: <uri>);
let (uri, _scheme, scheme, _authority, authority,
_userinfo, userinfo, host, _port, port,
path, _query, query, _fragment, fragment)
@@ -100,7 +104,9 @@
// relative / absolute
-define function relative? (uri :: <uri>) => (result :: <boolean>);
+define function relative?
+ (uri :: <uri>)
+ => (result :: <boolean>);
empty?(uri.uri-scheme)
end;
@@ -108,7 +114,9 @@
// split parts
-define method split-path (path :: <string>) => (parts :: <sequence>);
+define method split-path
+ (path :: <string>)
+ => (parts :: <sequence>);
let parts = split(path, "/", remove-if-empty: #f);
map(percent-decode, parts);
end;
@@ -138,21 +146,32 @@
else
qvalue := #t;
end if;
- table[qname] := qvalue;
+ if (element(table, qname, default: #f))
+ table[qname] := if (instance?(table[qname], <string>))
+ list(table[qname], qvalue);
+ else
+ pair(qvalue, table[qname]);
+ end if;
+ else
+ table[qname] := qvalue;
+ end if;
end for;
table;
end method split-query;
define method as
- (class == <string>, uri :: <uri>) => (result :: <string>)
+ (class == <string>, uri :: <uri>)
+ => (result :: <string>)
build-uri(uri)
end method as;
// build-uri
-define open generic build-uri (uri :: <uri>) => (result :: <string>);
+define open generic build-uri (uri :: <uri>) => (result :: <string>);
-define method build-uri (uri :: <uri>) => (result :: <string>);
+define method build-uri
+ (uri :: <uri>)
+ => (result :: <string>);
let result :: <string> = "";
unless (empty?(uri.uri-scheme))
result := concatenate(result, uri.uri-scheme, ":");
@@ -192,16 +211,14 @@
define open generic build-query (query :: <object>, #key) => (encoded-query :: <string>);
-define method build-query (uri :: <uri>, #key include :: <sequence> = #()) => (encoded-query :: <string>);
+define method build-query
+ (uri :: <uri>, #key include :: <sequence> = #())
+ => (encoded-query :: <string>);
if (empty?(uri.uri-query)) "" else
let parts = make(<stretchy-vector>);
for (value keyed-by key in uri.uri-query)
key := percent-encode(#"query", key, include: include);
- add!(parts, if (value == #t)
- key
- else
- concatenate(key, "=", percent-encode(#"query", value, include: include));
- end if);
+ add-key-value(parts, key, value, include: include);
end for;
join(parts, "&")
end if;
@@ -211,6 +228,32 @@
next-method(url, include: #('+'));
end;
+
+define method add-key-value
+ (parts :: <stretchy-vector>, key :: <string>, value :: <string>,
+ #key include :: <sequence> = #())
+ => (parts :: <stretchy-vector>);
+ add!(parts, concatenate(key, "=", percent-encode(#"query", value, include: include)));
+end;
+
+define method add-key-value
+ (parts :: <stretchy-vector>, key :: <string>, value == #t,
+ #key #all-keys)
+ => (parts :: <stretchy-vector>);
+ add!(parts, key);
+end;
+
+define method add-key-value
+ (parts :: <stretchy-vector>, key :: <string>, values :: <list>,
+ #key include :: <sequence> = #())
+ => (parts :: <stretchy-vector>);
+ for (value in values)
+ add-key-value(parts, key, value, include: include);
+ end for;
+ parts;
+end;
+
+
// percent-encode
define generic percent-encode (part :: <object>, unencoded :: <object>, #key) => (encoded :: <string>);
@@ -351,10 +394,14 @@
begin
+ let bar = "/foo?users=admin&users=1&users=2&members=3&members=4&comment=&add=Add";
+ let foo = parse-url(bar);
+ format-out("%=, %=\n", foo.uri-query["users"], foo.uri-query["members"]);
+ format-out("%s\n%s\n", bar, foo);
+/*
let foo = parse-url("http://baz.blub/pat%2fh/test?fo%20o=ba%2f%20r");
format-out("%s, %=,%s\n", foo.uri-query, foo.uri-path, foo);
-/*
format-out("%s\n", split-query("foo=bar+blub&baz", replacements: list(pair("\\+", " ")))["foo"]);
let uri = parse-uri("http://foo:bar@baz.blub:23/path/test/../page?fo%20=ba+r&q1=q2&q3=&q4#extra");
More information about the chatter
mailing list