Changeset 12858 in project


Ignore:
Timestamp:
12/19/08 22:49:55 (13 years ago)
Author:
sjamaan
Message:

Merge latest changes from uri-generic release 4

Location:
release/3/uri-generic/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • release/3/uri-generic/trunk

  • release/3/uri-generic/trunk/tests/run.scm

    r12842 r12858  
    213213
    214214(define internal-representation-cases
    215   `((,uri-scheme
     215  `(("scheme" ,uri-scheme
    216216     ;; pct-encoding not allowed in scheme
    217217     ("http.:" http.)
     
    222222     ("/foo" #f)
    223223     (":" ||))
    224     (,uri-path
     224    ("username" ,uri-username
     225     ("//foo" #f)
     226     ("//@" "")
     227     ("//foo@" "foo")
     228     ("//foo:bar@" "foo")
     229     ("//foo:bar:qux@" "foo")
     230     ("//foo%20bar@" "foo%20bar")
     231     ("//foo%3Abar:qux@" "foo%3Abar") ;; %3A = ':'
     232     ("//foo%2Ebar@" "foo.bar" "//foo.bar@"))
     233    ("password ",uri-password
     234     ("//foo" #f)
     235     ("//@" #f)
     236     ("//foo@" #f)
     237     ("//foo:bar@" "bar")
     238     ("//foo:bar:qux@" "bar:qux")
     239     ("//foo:bar%20qux@" "bar%20qux")
     240     ("//foo:bar%2Equx@" "bar.qux" "//foo:bar.qux@"))
     241    ("path" ,uri-path
     242     ("//foo" ())   ; Can path ever be #f?
    225243     ("foo%20bar" ("foo%20bar"))
    226244     ("foo%2Fbar" ("foo/bar"))
     
    231249     ("/foo%2Fbar" (/ "foo/bar"))
    232250     ("/foo/" (/ "foo" ""))
    233      ("/foo:bar" (/ "foo:bar")))))
     251     ("/foo:bar" (/ "foo:bar")))
     252    ("query ",uri-query
     253     ("//" #f)
     254     ("?foo" "foo")
     255     ("?foo?bar" "foo?bar")
     256     ("?foo/bar" "foo/bar")
     257     ("?foo%3Fbar" "foo%3Fbar")
     258     ("?foo%2Ebar" "foo.bar" "?foo.bar"))
     259    ("fragment" ,uri-fragment
     260     ("?foo" #f)
     261     ("#bar" "bar")
     262     ("?foo#bar" "bar")
     263     ("#foo?bar" "foo?bar")
     264     ("#foo/bar" "foo/bar")
     265     ("#foo%3Fbar" "foo%3Fbar")
     266     ("#foo%2Ebar" "foo.bar" "#foo.bar"))))
    234267
    235268(test-group "internal representations"
    236269  (for-each (lambda (p)
    237               (for-each (lambda (u)
    238                           (let ((in (first u))
    239                                 (internal (second u))
    240                                 (out (if (null? (cddr u))
    241                                          (first u)
    242                                          (third u)))
    243                                 (uri (uri-reference (first u))))
    244                             (test (sprintf "~S decoded as ~S" in internal)
    245                                   internal ((car p) uri))
    246                             (test (sprintf "~S encoded to ~S" internal out)
    247                                   out (uri->string uri))))
    248                         (cdr p)))
     270              (test-group (car p)
     271               (for-each (lambda (u)
     272                           (let ((in (first u))
     273                                 (internal (second u))
     274                                 (out (if (null? (cddr u))
     275                                          (first u)
     276                                          (third u)))
     277                                 (uri (uri-reference (first u))))
     278                             (test (sprintf "~S decoded as ~S" in internal)
     279                                   internal ((cadr p) uri))
     280                             (test (sprintf "~S encoded to ~S" internal out)
     281                                   out (uri->string uri
     282                                                    (lambda (u p)
     283                                                      (if p (conc u ":" p) u))))))
     284                         (cddr p))))
    249285            internal-representation-cases))
    250286
  • release/3/uri-generic/trunk/uri-generic.scm

    r12850 r12858  
    338338
    339339;;  RFC3986, section 3.2
     340;;
     341;;     authority     = [ userinfo "@" ] host [ ":" port ]
    340342
    341343(define (authority s)
     
    350352
    351353;;  RFC3986, section 3.2.1
     354;;
     355;;     userinfo      = *( unreserved / pct-encoded / sub-delims / ":" )
     356;;
     357;; We split this up in the leading part without colons ("username") and
     358;; everything after that ("password"), including extra colons.
     359;;
     360;; The RFC is not very clear, but it does mention this:
     361;;   "The userinfo subcomponent may consist of a user name and,
     362;;    optionally, scheme-specific information about how to gain
     363;;    authorization to access the resource."
     364;;
     365;; The grammar allows multiple colons, and the RFC then continues:
     366;;   "Applications should not render as clear text any data after
     367;;    the first colon (":") character found within a userinfo
     368;;    subcomponent unless the data after the colon is the empty
     369;;    string (indicating no password)."
    352370
    353371(define userinfo0  (many (uchar ";&=+$,")))
     372(define userinfo1  (many (uchar ";&=+$,:")))
    354373
    355374(define (userinfo s)
    356375  (match (userinfo0 s)
    357          ((uu ( #\: . rst))   (match (userinfo0 rst)
     376         ((uu ( #\: . rst))   (match (userinfo1 rst)
    358377                                     ((up ( #\@ . rst) ) (list uu up rst))
    359378                                     (else #f)))
    360          ((uu ( #\@ . rst)) (list uu (list) rst))
    361          (else #f)))
    362 
     379         ((uu ( #\@ . rst)) (list uu #f rst))
     380         (else #f)))
    363381
    364382
    365383;;  RFC3986, section 3.2.2
     384;;
     385;;     host          = IP-literal / IPv4address / reg-name
     386;;     IP-literal    = "[" ( IPv6address / IPvFuture  ) "]"
     387;;     IPvFuture     = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )
    366388
    367389(define (host s)  (or (ip-literal s) (ipv4-address s) (reg-name s)))
     
    385407
    386408
    387 ;; Pv6address =                            6( h16 ":" ) ls32
     409;; IPv6address =                                  6( h16 ":" ) ls32
    388410;;                   /                       "::" 5( h16 ":" ) ls32
    389411;;                   / [               h16 ] "::" 4( h16 ":" ) ls32
     
    551573
    552574;;  RFC3986, section 3.2.3
     575;;
     576;;     port          = *DIGIT
    553577
    554578(define port0 (many char-numeric?))
     
    722746  (match uri-auth
    723747         (($ URIAuth username password host port)
    724           (string-append "//" (if (and username password)
     748          (string-append "//" (if username
    725749                                  ((lambda (x) (or (and x (string-append x "@")) ""))
    726750                                   (userinfomap username password)) "")
Note: See TracChangeset for help on using the changeset viewer.