*add comment explaining why we don't need to support "*" and authority
Request-URIS *comment on when unescaping is done *don't unescape query when building a http-url record *don't escape query when unparsing a http-url record. *remove PARSED-URI->HTTP-URL, integrate its code into URL-STRING->HTTP-URL *add dummy encoder ESCAPE-NOT-UNRESERVED-CHARS
This commit is contained in:
parent
745a123735
commit
ed53670895
|
@ -43,6 +43,12 @@
|
|||
;;; Request-URI = ( http_URL | abs_path ["?" query] ) ["#" fragment]
|
||||
|
||||
|
||||
;;; Note: we don't have to support Request-URIS of the form "*" or
|
||||
;;; authority, because these are not used with the any of the methods
|
||||
;;; HEAD, GET and POST, which are the only methods we implement so
|
||||
;;; far.
|
||||
|
||||
|
||||
;;; Here we depart from the RFCs:
|
||||
;;; RFC 2616 and 1945 disallow a #fragment-suffix of the Request-URI.
|
||||
;;; For compatibility with buggy clients we _do_ allow for it.
|
||||
|
@ -159,7 +165,8 @@
|
|||
;;; If there's no abs_path given, or abs_path is "/", path is the empty list;
|
||||
;;; otherwise it is a list containing the path's segments.
|
||||
;;;
|
||||
;;; don't decode yet!
|
||||
|
||||
;;; Caution: parse-url doesn't unescape anything yet!
|
||||
|
||||
(define (parse-url request-uri)
|
||||
(cond
|
||||
|
@ -214,9 +221,14 @@
|
|||
;;;
|
||||
;;; The PATH slot is the Request_URI's path split at slashes
|
||||
;;; (e.g., "/foo///bar//baz/" => ("foo" "bar" "baz"))
|
||||
;;; and decoded.
|
||||
;;; and unescaped.
|
||||
;;;
|
||||
;;; The QUERY slot is a decoded non-empty-string or #f.
|
||||
;;; The QUERY slot is an non-empty-string, still in its escaped
|
||||
;;; representation, or #f.
|
||||
|
||||
;;; Caution: the path slot of a http-url record has already been
|
||||
;;; UNESCAPED; don't unescape it a second time!
|
||||
;;; The query slot is still in its escaped representation.
|
||||
|
||||
(define-record-type http-url :http-url
|
||||
(make-http-url host port path query)
|
||||
|
@ -226,24 +238,16 @@
|
|||
(path http-url-path)
|
||||
(query http-url-query))
|
||||
|
||||
;;; decode various parts of the Request_URI as returned by PARSE-URL;
|
||||
;;; returns a HTTP-URL record.
|
||||
|
||||
(define (parsed-uri->http-url host port path query)
|
||||
|
||||
(let ((portnumber (and port (string->number port)))
|
||||
(decoded-path (map unescape path))
|
||||
(decoded-query (and query (unescape query))))
|
||||
|
||||
(make-http-url host portnumber decoded-path decoded-query)))
|
||||
|
||||
|
||||
;;; parse a HTTP 1.1. Request_URI into a http-url record
|
||||
|
||||
(define (url-string->http-url uri-string)
|
||||
(call-with-values
|
||||
(lambda () (parse-url uri-string))
|
||||
parsed-uri->http-url))
|
||||
(receive (host port path query)
|
||||
(parse-url uri-string)
|
||||
(let ((portnumber (and port (string->number port)))
|
||||
(unescaped-path (map unescape path)))
|
||||
(make-http-url host portnumber unescaped-path query))))
|
||||
|
||||
|
||||
;;; Unparse a http-url record into its corresponding Request_URI
|
||||
|
||||
|
@ -271,7 +275,7 @@
|
|||
|
||||
(query (http-url-query http-url))
|
||||
(query-string (if query
|
||||
(string-append "?" (escape-query query))
|
||||
(string-append "?" query)
|
||||
"")))
|
||||
|
||||
(string-append scheme-and-host-string port-string path-string query-string)))
|
||||
|
@ -309,6 +313,10 @@
|
|||
(define (escape-query query)
|
||||
(escape query query-reserved-and-excluded))
|
||||
|
||||
;;; encode something we don't know: escape all but the unreserved characters.
|
||||
(define (escape-not-unreserved-chars something)
|
||||
(escape something (rx (~ ,unreserved))))
|
||||
|
||||
;; Appendix A of RFC 2396
|
||||
;;
|
||||
;A. Collected BNF for URI
|
||||
|
|
Loading…
Reference in New Issue