Steps toward sane static/dynamic URL split; better directory handling

This commit is contained in:
Tony Garnock-Jones 2015-01-26 16:31:46 -05:00
parent ede3185e93
commit 1537b2da2c
6 changed files with 58 additions and 30 deletions

View File

@ -37,12 +37,14 @@ Keys useful for development:
`http://pkgs.racket-lang.org/pkgs-all.json.gz`. `http://pkgs.racket-lang.org/pkgs-all.json.gz`.
- *package-fetch-interval*; number, in seconds; default 300. - *package-fetch-interval*; number, in seconds; default 300.
- *session-lifetime*: number, in seconds; default 604800. - *session-lifetime*: number, in seconds; default 604800.
- *static-cached-directory*: string; names a directory relative to - *static-generated-directory*: string; names a directory relative to
`src/` within which generated static HTML files are to be placed. `src/` within which generated static HTML files are to be placed.
Must be writable by the user running the server. Must be writable by the user running the server.
- *static-cached-urlprefix*: string; absolute or relative URL, - *static-urlprefix*: string; absolute or relative URL, prepended to
prepended to relative URLs referring to generated static HTML files relative URLs referring to static HTML files placed in
placed in `static-cached-directory`. `static-generated-directory`.
- *dynamic-urlprefix*: string; absolute or relative URL, prepended to
URLs targetting dynamic content on the site.
- *disable-cache?*: boolean; default `#f`. - *disable-cache?*: boolean; default `#f`.
- *backend-baseurl*: string; default `https://pkgd.racket-lang.org`. - *backend-baseurl*: string; default `https://pkgd.racket-lang.org`.
Must point to the backend package server API root, such that (for Must point to the backend package server API root, such that (for

View File

@ -4,8 +4,9 @@
(main (hash 'port 8444 (main (hash 'port 8444
'reloadable? #t 'reloadable? #t
'package-index-url "http://localhost/~tonyg/pkg-catalog-static/pkgs-all.json.gz" 'package-index-url "http://localhost/~tonyg/pkg-catalog-static/pkgs-all.json.gz"
'static-cached-directory (build-path (find-system-path 'home-dir) 'static-generated-directory (build-path (find-system-path 'home-dir)
"public_html/pkg-catalog-static") "public_html/pkg-catalog-static")
'static-cached-urlprefix "http://localhost/~tonyg/pkg-catalog-static/" 'static-urlprefix "http://localhost/~tonyg/pkg-catalog-static"
'dynamic-urlprefix "https://localhost:8444"
'backend-baseurl "https://localhost:8445" 'backend-baseurl "https://localhost:8445"
)) ))

View File

@ -1,7 +1,8 @@
#lang racket/base #lang racket/base
;; Utilities for working with Twitter Bootstrap, http://getbootstrap.com/2.3.2/ ;; Utilities for working with Twitter Bootstrap, http://getbootstrap.com/2.3.2/
(provide bootstrap-project-name (provide bootstrap-static-urlprefix
bootstrap-project-name
bootstrap-project-link bootstrap-project-link
bootstrap-navbar-header bootstrap-navbar-header
bootstrap-navigation bootstrap-navigation
@ -24,6 +25,7 @@
(require "html-utils.rkt") (require "html-utils.rkt")
(require "xexpr-utils.rkt") (require "xexpr-utils.rkt")
(define bootstrap-static-urlprefix (make-parameter ""))
(define bootstrap-project-name (make-parameter "Project")) (define bootstrap-project-name (make-parameter "Project"))
(define bootstrap-project-link (make-parameter "/")) (define bootstrap-project-link (make-parameter "/"))
(define bootstrap-navbar-header (make-parameter #f)) (define bootstrap-navbar-header (make-parameter #f))
@ -34,6 +36,9 @@
(define bootstrap-page-scripts (make-parameter '())) (define bootstrap-page-scripts (make-parameter '()))
(define bootstrap-cookies (make-parameter '())) (define bootstrap-cookies (make-parameter '()))
(define (static str)
(string-append (bootstrap-static-urlprefix) str))
;; String [#:title-element XExpr] [#:code Integer] [#:message Bytes] [XExpr ...] -> Response ;; String [#:title-element XExpr] [#:code Integer] [#:message Bytes] [XExpr ...] -> Response
(define (bootstrap-response title (define (bootstrap-response title
#:title-element [title-element `(h1 ,title)] #:title-element [title-element `(h1 ,title)]
@ -52,9 +57,9 @@
(meta ((http-equiv "X-UA-Compatible") (content "IE=edge"))) (meta ((http-equiv "X-UA-Compatible") (content "IE=edge")))
(meta ((name "viewport") (content "width=device-width, initial-scale=1"))) (meta ((name "viewport") (content "width=device-width, initial-scale=1")))
(title ,title) (title ,title)
(link ((rel "stylesheet") (href "/bootstrap/css/bootstrap.min.css") (type "text/css"))) (link ((rel "stylesheet") (href ,(static "/bootstrap/css/bootstrap.min.css")) (type "text/css")))
(link ((rel "stylesheet") (href "/jquery-ui.min.css") (type "text/css"))) (link ((rel "stylesheet") (href ,(static "/jquery-ui.min.css")) (type "text/css")))
(link ((rel "stylesheet") (href "/style.css") (type "text/css"))) (link ((rel "stylesheet") (href ,(static "/style.css")) (type "text/css")))
,@(for/list ((sheet (bootstrap-page-stylesheets))) ,@(for/list ((sheet (bootstrap-page-stylesheets)))
`(link ((rel "stylesheet") (href ,sheet) (type "text/css"))))) `(link ((rel "stylesheet") (href ,sheet) (type "text/css")))))
(body ,@(maybe-splice body-class `((class ,body-class))) (body ,@(maybe-splice body-class `((class ,body-class)))
@ -85,11 +90,11 @@
,title-element ,title-element
,@body-contents) ,@body-contents)
(script ((type "text/javascript") (src "/jquery.min.js"))) (script ((type "text/javascript") (src ,(static "/jquery.min.js"))))
(script ((type "text/javascript") (src "/jquery.tablesorter.min.js"))) (script ((type "text/javascript") (src ,(static "/jquery.tablesorter.min.js"))))
(script ((type "text/javascript") (src "/jquery-ui.min.js"))) (script ((type "text/javascript") (src ,(static "/jquery-ui.min.js"))))
(script ((type "text/javascript") (src "/bootstrap/js/bootstrap.min.js"))) (script ((type "text/javascript") (src ,(static "/bootstrap/js/bootstrap.min.js"))))
(script ((type "text/javascript") (src "/site.js"))) (script ((type "text/javascript") (src ,(static "/site.js"))))
,@(for/list ((script (bootstrap-page-scripts))) ,@(for/list ((script (bootstrap-page-scripts)))
`(script ((type "text/javascript") (src ,script)))))))) `(script ((type "text/javascript") (src ,script))))))))

View File

@ -13,7 +13,8 @@
(define (start-service* #:port [port 8443] (define (start-service* #:port [port 8443]
#:ssl? [ssl? #t] #:ssl? [ssl? #t]
request-handler-function request-handler-function
on-continuation-expiry) on-continuation-expiry
extra-files-paths)
(start-restart-signal-watcher) (start-restart-signal-watcher)
((daemonize-thunk ((daemonize-thunk
'main-web-server-thread 'main-web-server-thread
@ -27,8 +28,7 @@
on-continuation-expiry on-continuation-expiry
;; This value is copied from web-server/servlet-env.rkt: ;; This value is copied from web-server/servlet-env.rkt:
(* 128 1024 1024)) (* 128 1024 1024))
#:extra-files-paths (list (build-path (current-directory) #:extra-files-paths (extra-files-paths)
"../static"))
#:ssl? ssl? #:ssl? ssl?
#:ssl-cert (and ssl? (build-path (current-directory) "../server-cert.pem")) #:ssl-cert (and ssl? (build-path (current-directory) "../server-cert.pem"))
#:ssl-key (and ssl? (build-path (current-directory) "../private-key.pem")) #:ssl-key (and ssl? (build-path (current-directory) "../private-key.pem"))
@ -38,11 +38,13 @@
#:ssl? [ssl? #t] #:ssl? [ssl? #t]
#:reloadable? [reloadable? #t] #:reloadable? [reloadable? #t]
request-handler-entry-point request-handler-entry-point
on-continuation-expiry-entry-point) on-continuation-expiry-entry-point
extra-files-paths-entry-point)
(when (not reloadable?) (when (not reloadable?)
(set-reload-poll-interval! #f)) (set-reload-poll-interval! #f))
(reload!) (reload!)
(start-service* #:port port (start-service* #:port port
#:ssl? ssl? #:ssl? ssl?
(reloadable-entry-point->procedure request-handler-entry-point) (reloadable-entry-point->procedure request-handler-entry-point)
(reloadable-entry-point->procedure on-continuation-expiry-entry-point))) (reloadable-entry-point->procedure on-continuation-expiry-entry-point)
(reloadable-entry-point->procedure extra-files-paths-entry-point)))

View File

@ -15,4 +15,5 @@
#:ssl? (hash-ref config 'ssl? (lambda () #t)) #:ssl? (hash-ref config 'ssl? (lambda () #t))
#:reloadable? (hash-ref config 'reloadable? (lambda () (getenv "SITE_RELOADABLE"))) #:reloadable? (hash-ref config 'reloadable? (lambda () (getenv "SITE_RELOADABLE")))
(make-reloadable-entry-point 'request-handler "site.rkt") (make-reloadable-entry-point 'request-handler "site.rkt")
(make-reloadable-entry-point 'on-continuation-expiry "site.rkt"))) (make-reloadable-entry-point 'on-continuation-expiry "site.rkt")
(make-reloadable-entry-point 'extra-files-paths "site.rkt")))

View File

@ -2,8 +2,10 @@
(provide request-handler (provide request-handler
on-continuation-expiry on-continuation-expiry
extra-files-paths
rerender-all!) rerender-all!)
(require racket/runtime-path)
(require racket/set) (require racket/set)
(require racket/match) (require racket/match)
(require racket/format) (require racket/format)
@ -25,18 +27,29 @@
(require "config.rkt") (require "config.rkt")
(require "hash-utils.rkt") (require "hash-utils.rkt")
(define static-cached-directory (define static-generated-directory
(or (@ (config) static-cached-directory) (or (@ (config) static-generated-directory)
"../static/cached")) "../static/cached"))
(define static-cached-urlprefix (define static-urlprefix
(or (@ (config) static-cached-urlprefix) (or (@ (config) static-urlprefix)
"/cached")) "/cached"))
(define dynamic-urlprefix
(or (@ (config) dynamic-urlprefix)
""))
(define disable-cache? (define disable-cache?
(or (@ (config) disable-cache?) (or (@ (config) disable-cache?)
#f)) #f))
(define-runtime-path here ".")
(define (extra-files-paths)
(list (if (relative-path? static-generated-directory)
(build-path here static-generated-directory)
static-generated-directory)
(build-path here "../static")))
(define nav-index "Package Index") (define nav-index "Package Index")
(define nav-search "Search") (define nav-search "Search")
@ -72,7 +85,7 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define-values (request-handler named-url) (define-values (request-handler relative-named-url)
(dispatch-rules (dispatch-rules
[("index") main-page] [("index") main-page]
[("") main-page] [("") main-page]
@ -96,6 +109,9 @@
(define static-render (make-parameter #f)) (define static-render (make-parameter #f))
(define (named-url . args)
(string-append dynamic-urlprefix (apply relative-named-url args)))
(define-syntax-rule (authentication-wrap #:request request body ...) (define-syntax-rule (authentication-wrap #:request request body ...)
(authentication-wrap* #f request (lambda () body ...))) (authentication-wrap* #f request (lambda () body ...)))
@ -105,6 +121,7 @@
(define-syntax-rule (with-site-config body ...) (define-syntax-rule (with-site-config body ...)
(parameterize ((bootstrap-navbar-header navbar-header) (parameterize ((bootstrap-navbar-header navbar-header)
(bootstrap-navigation navigation) (bootstrap-navigation navigation)
(bootstrap-static-urlprefix static-urlprefix)
(jsonp-baseurl backend-baseurl)) (jsonp-baseurl backend-baseurl))
body ...)) body ...))
@ -413,13 +430,13 @@
(define (main-page-url) (define (main-page-url)
(if (use-cache?) (if (use-cache?)
(format "~a/index.html" static-cached-urlprefix) (format "~a/index.html" static-urlprefix)
(named-url main-page))) (named-url main-page)))
(define (view-package-url package-name) (define (view-package-url package-name)
(define package-name-str (~a package-name)) (define package-name-str (~a package-name))
(if (use-cache?) (if (use-cache?)
(format "~a~a" static-cached-urlprefix (named-url package-page package-name-str)) (format "~a~a" static-urlprefix (named-url package-page package-name-str))
(named-url package-page package-name-str))) (named-url package-page package-name-str)))
(define (package-link package-name) (define (package-link package-name)
@ -1289,7 +1306,7 @@
"127.0.0.1") "127.0.0.1")
named-url-args)) named-url-args))
servlet-prompt))))) servlet-prompt)))))
(define filename (format "~a~a" static-cached-directory (or base-filename request-url))) (define filename (format "~a~a" static-generated-directory (or base-filename request-url)))
(make-parent-directory* filename) (make-parent-directory* filename)
(call-with-output-file filename (call-with-output-file filename
(response-output response) (response-output response)