[Gd-hackers] [Gd-chatter] r11736 - trunk/libraries/uri

Carl Gay cgay at itasoftware.com
Thu Mar 20 00:00:55 CET 2008


Looks like some testing code was not commented out...

turbo24prg at leibniz.gwydiondylan.org wrote:
> 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 hackers mailing list