Shedding bad interfaces

svn: r6424
This commit is contained in:
Jay McCarthy 2007-05-30 23:16:58 +00:00
parent 1b02edd3d9
commit 44a49ff272
6 changed files with 109 additions and 209 deletions

View File

@ -20,7 +20,6 @@
"../managers/timeouts.ss"
"../managers/lru.ss"
"../managers/none.ss"
"../private/url.ss"
"../private/servlet.ss"
"../private/cache-table.ss")
(provide/contract

View File

@ -1,77 +0,0 @@
(module url mzscheme
(require (lib "contract.ss")
(lib "url.ss" "net")
(lib "list.ss")
(lib "plt-match.ss"))
(provide/contract
[match-url-params (string? . -> . (or/c false/c (list/c string? string? string? string?)))]
[continuation-url? (url? . -> . (or/c boolean? (list/c number? number? number?)))]
[embed-ids ((list/c number? number? number?) url? . -> . string?)])
;; ********************************************************************************
;; Parameter Embedding
(define URL-PARAMS:REGEXP (regexp "([^\\*]*)\\*([^\\*]*)\\*([^\\*]*)"))
(define (match-url-params x) (regexp-match URL-PARAMS:REGEXP x))
;; embed-ids: (list number number number) url -> string
(define embed-ids
(match-lambda*
[(list (list inst-id k-id salt) in-url)
(insert-param
in-url
(format "~a*~a*~a" inst-id k-id salt))]))
;; continuation-url?: url -> (or/c (list number number number) #f)
;; determine if this url encodes a continuation and extract the instance id and
;; continuation id.
(define (continuation-url? a-url)
(let ([k-params (filter match-url-params
(apply append (map path/param-param (url-path a-url))))])
(if (empty? k-params)
#f
(match (match-url-params (first k-params))
[(list s instance k-id salt)
(let ([instance/n (string->number instance)]
[k-id/n (string->number k-id)]
[salt/n (string->number salt)])
(if (and (number? instance/n)
(number? k-id/n)
(number? salt/n))
(list instance/n
k-id/n
salt/n)
; XXX: Maybe log this in some way?
#f))]))))
;; insert-param: url string -> string
;; add a path/param to the path in a url
;; (assumes that there is only one path/param)
(define (insert-param in-url new-param-str)
(url->string
(replace-path
(lambda (old-path)
(if (empty? old-path)
(list (make-path/param "" (list new-param-str)))
(list* (make-path/param (path/param-path (first old-path))
(list new-param-str))
(rest old-path))))
in-url)))
;; replace-path: (url-path -> url-path) url -> url
;; make a new url by replacing the path part of a url with a function
;; of the url's old path
;; also remove the query
(define (replace-path proc in-url)
(let ([new-path (proc (url-path in-url))])
(make-url
(url-scheme in-url)
(url-user in-url)
(url-host in-url)
(url-port in-url)
(url-path-absolute? in-url)
new-path
empty
(url-fragment in-url)))))

View File

@ -1,9 +1,36 @@
(module util mzscheme
(require (lib "contract.ss")
(require (lib "list.ss")
(lib "contract.ss")
(lib "string.ss")
(lib "url.ss" "net")
(lib "uri-codec.ss" "net"))
(require "../request-structs.ss")
(lib "url.ss" "net"))
(provide
url-replace-path)
(provide/contract
[url-path->string ((listof (or/c string? path/param?)) . -> . string?)]
[extract-flag (symbol? (listof (cons/c symbol? any/c)) any/c . -> . any/c)]
[network-error ((symbol? string?) (listof any/c) . ->* . (void))]
[path->list (path? . -> . (cons/c (or/c path? (symbols 'up 'same))
(listof (or/c path? (symbols 'up 'same)))))]
[directory-part (path? . -> . path?)]
[lowercase-symbol! ((or/c string? bytes?) . -> . symbol?)]
[exn->string ((or/c exn? any/c) . -> . string?)]
[build-path-unless-absolute (path-string? path-string? . -> . path?)])
;; replace-path: (url-path -> url-path) url -> url
;; make a new url by replacing the path part of a url with a function
;; of the url's old path
;; also remove the query
(define (url-replace-path proc in-url)
(let ([new-path (proc (url-path in-url))])
(make-url
(url-scheme in-url)
(url-user in-url)
(url-host in-url)
(url-port in-url)
(url-path-absolute? in-url)
new-path
empty
(url-fragment in-url))))
;; ripped this off from url-unit.ss
(define (url-path->string strs)
@ -52,7 +79,7 @@
s)])
(string-lowercase! s)
(string->symbol s)))
(define (directory-part path)
(let-values ([(base name must-be-dir) (split-path path)])
(cond
@ -78,15 +105,4 @@
(let ([x (assq name flags)])
(if x
(cdr x)
default)))
(provide/contract
[url-path->string ((listof (or/c string? path/param?)) . -> . string?)]
[extract-flag (symbol? (listof (cons/c symbol? any/c)) any/c . -> . any/c)]
[network-error ((symbol? string?) (listof any/c) . ->* . (void))]
[path->list (path? . -> . (cons/c (or/c path? (symbols 'up 'same))
(listof (or/c path? (symbols 'up 'same)))))]
[directory-part (path? . -> . path?)]
[lowercase-symbol! ((or/c string? bytes?) . -> . symbol?)]
[exn->string ((or/c exn? any/c) . -> . string?)]
[build-path-unless-absolute (path-string? path-string? . -> . path?)]))
default))))

View File

@ -3,8 +3,8 @@
(lib "url.ss" "net")
(lib "plt-match.ss")
(lib "list.ss")
(lib "serialize.ss")
"utils.ss")
"utils.ss"
"../../private/util.ss")
(provide/contract
[extract-param (url? string? . -> . (or/c string? false/c))]
@ -27,7 +27,7 @@
;; add a path/param to the path in a url
;; (assumes that there is only one path/param)
(define (insert-param in-url key val)
(replace-path
(url-replace-path
(match-lambda
[(list)
(list (make-path/param
@ -44,20 +44,4 @@
(filter (lambda (k*v) (not (equal? key (car k*v))))
(read/string (first (path/param-param f)))))))))
r))])])
in-url))
;; replace-path : (url-path -> url-path) url -> url
;; make a new url by replacing the path part of a url with a function
;; of the url's old path
;; also remove the query
(define (replace-path proc in-url)
(let ([new-path (proc (url-path in-url))])
(make-url
(url-scheme in-url)
(url-user in-url)
(url-host in-url)
(url-port in-url)
#t
new-path
(url-query in-url)
(url-fragment in-url)))))
in-url)))

View File

@ -1,101 +1,25 @@
(module servlet-url mzscheme
(require (lib "list.ss")
(lib "etc.ss")
(lib "contract.ss")
(lib "url.ss" "net")
(lib "struct.ss"))
(require "../private/url.ss"
"../request-structs.ss")
(lib "url.ss" "net"))
(require "../request-structs.ss"
"../private/util.ss")
(define-struct servlet-url (protocol host port
servlets-root
instance-id k-id nonce
servlet-path extra-path))
(define-struct servlet-url (url))
(define (servlet-url->url-string/no-continuation su)
(define in-url (servlet-url-url su))
(define first? (box #t))
(url->string
(make-url (servlet-url-protocol su)
#f
#f ;(servlet-url-host su)
#f ;(servlet-url-port su)
#t
(append (map (lambda (p/p)
(if (and (not (empty? (path/param-param p/p)))
; XXX: not robust
(match-url-params (first (path/param-param p/p))))
(make-path/param (path/param-path p/p) empty)
p/p))
(servlet-url-servlets-root su))
(servlet-url-servlet-path su)
(servlet-url-extra-path su))
empty
#f)))
(define (servlet-url->url-string su)
(let ([the-url
(make-url (servlet-url-protocol su)
#f
#f ;(servlet-url-host su)
#f ;(servlet-url-port su)
#t
(append (reverse (rest (reverse (servlet-url-servlets-root su))))
(list (make-path/param (path/param-path (first (reverse (servlet-url-servlets-root su))))
empty))
(servlet-url-servlet-path su)
(servlet-url-extra-path su))
empty
#f)])
(if (and (servlet-url-instance-id su)
(servlet-url-k-id su)
(servlet-url-nonce su))
(embed-ids (list (servlet-url-instance-id su)
(servlet-url-k-id su)
(servlet-url-nonce su))
the-url)
(url->string the-url))))
(define (servlet-url->servlet-url/no-extra-path su)
(copy-struct servlet-url su
[servlet-url-extra-path empty]))
(url-replace-path
(lambda (ps)
(map (lambda (p/p)
(if (unbox first?)
(make-path/param (path/param-path p/p) empty)
p/p))
ps)))))
(define (request->servlet-url req)
(uri->servlet-url (request-uri req)
(request-host-ip req)
(request-host-port req)))
(define uri->servlet-url
(opt-lambda (uri [default-host #f] [default-port #f])
(let-values ([(k-instance k-id k-salt)
(let ([k-parts (continuation-url? uri)])
(if k-parts
(apply values k-parts)
(values #f #f #f)))]
[(servlet-path path)
(let loop ([servlet-path empty]
[path (rest (url-path uri))])
(if (empty? path)
(values servlet-path path)
(let ([cur (first path)])
(if (regexp-match "\\.ss$" (path/param-path cur))
(values (append servlet-path (list cur))
(rest path))
(loop (append servlet-path (list cur))
(rest path))))))])
(make-servlet-url (url-scheme uri)
(or (url-host uri) default-host)
(or (url-port uri) default-port)
(list (first (url-path uri)))
k-instance k-id k-salt
servlet-path
path))))
(make-servlet-url (request-uri req)))
(provide/contract
[struct servlet-url ([protocol (or/c false/c string?)]
[host (or/c false/c string?)]
[port (or/c false/c natural-number/c)]
[servlets-root (listof path/param?)]
[instance-id number?]
[k-id number?]
[nonce number?]
[servlet-path (listof path/param?)]
[extra-path (listof path/param?)])]
[servlet-url->url-string (servlet-url? . -> . string?)]
[servlet-url->url-string/no-continuation (servlet-url? . -> . string?)]
[servlet-url->servlet-url/no-extra-path (servlet-url? . -> . servlet-url?)]
[request->servlet-url (request? . -> . servlet-url?)]
[uri->servlet-url ((url?) ((or/c false/c string?) (or/c false/c natural-number/c)) . opt-> . servlet-url?)]))
[request->servlet-url (request? . -> . servlet-url?)]))

View File

@ -1,10 +1,13 @@
(module web mzscheme
(require (lib "contract.ss")
(require (lib "url.ss" "net")
(lib "list.ss")
(lib "plt-match.ss")
(lib "contract.ss")
(lib "etc.ss")
(lib "xml.ss" "xml"))
(require "../managers/manager.ss"
"../private/util.ss"
"../private/servlet.ss"
"../private/url.ss"
"../servlet/helpers.ss"
"../servlet/web-cells.ss"
"../request-structs.ss"
@ -12,6 +15,57 @@
;; ************************************************************
;; HELPERS
(provide/contract
[continuation-url? (url? . -> . (or/c boolean? (list/c number? number? number?)))]
[embed-ids ((list/c number? number? number?) url? . -> . string?)])
;; ********************************************************************************
;; Parameter Embedding
;; embed-ids: (list number number number) url -> string
(define embed-ids
(match-lambda*
[(list (list inst-id k-id salt) in-url)
(insert-param
in-url
(format "~a*~a*~a" inst-id k-id salt))]))
;; continuation-url?: url -> (or/c (list number number number) #f)
;; determine if this url encodes a continuation and extract the instance id and
;; continuation id.
(define (continuation-url? a-url)
(define (match-url-params x) (regexp-match #rx"([^\\*]*)\\*([^\\*]*)\\*([^\\*]*)" x))
(let ([k-params (filter match-url-params
(apply append (map path/param-param (url-path a-url))))])
(if (empty? k-params)
#f
(match (match-url-params (first k-params))
[(list s instance k-id salt)
(let ([instance/n (string->number instance)]
[k-id/n (string->number k-id)]
[salt/n (string->number salt)])
(if (and (number? instance/n)
(number? k-id/n)
(number? salt/n))
(list instance/n
k-id/n
salt/n)
; XXX: Maybe log this in some way?
#f))]))))
;; insert-param: url string -> string
;; add a path/param to the path in a url
;; (assumes that there is only one path/param)
(define (insert-param in-url new-param-str)
(url->string
(url-replace-path
(lambda (old-path)
(if (empty? old-path)
(list (make-path/param "" (list new-param-str)))
(list* (make-path/param (path/param-path (first old-path))
(list new-param-str))
(rest old-path))))
in-url)))
;; replace-procedures : (proc -> url) xexpr/callbacks? -> xexpr?
;; Change procedures to the send/suspend of a k-url
@ -38,7 +92,7 @@
[send/forward ((response-generator?) (expiration-handler?) . opt-> . request?)]
[send/suspend/dispatch ((embed/url? . -> . servlet-response?) . -> . any/c)]
[send/suspend/callback (xexpr/callback? . -> . any/c)])
;; ************************************************************
;; EXPORTS