sunet/scheme/httpd/surflets/web-server/root/surflets/add-raw.scm

116 lines
2.8 KiB
Scheme

(define-structure servlet servlet-interface
(open httpd-requests ; REQUEST-URL
httpd-responses ; MAKE-RESPONSE
parse-html-forms ; PARSE-HTML-FORM-QUERY
url ; HTTP-URL-SEARCH
srfi-1 ; FILTER
servlet-handler/servlet ; SEND/SUSPEND, SEND/FINISH
scheme-with-scsh)
(begin
(define (extract-bindings key bindings)
(map cdr
(filter (lambda (binding)
(equal? (car binding) key))
bindings)))
(define (extract-single-binding key bindings)
(let ((bindings (extract-bindings key bindings)))
(if (null? bindings)
(error "no binding")
(car bindings))))
(define (make-get-number-page input-text title)
(lambda (new-url)
(let ((HTML-page (format #f "
<HTML>~a
<BODY>~a
<P>
<FORM method=\"GET\" action=\"~a\">
~a
<INPUT type=\"text\" name=\"number\">
<INPUT type=\"submit\">
</FORM>
</P>
<HR>
<P>
<A href=\"/\">Return to main menu.</A><BR>
<A href=\"add-html.scm\">Start new calculation.</A>
</P>
</BODY>
</HTML>"
(if title
(format #f "<TITLE>~a</TITLE>" title)
"")
(if title
(format #f "<H2>~a</H2>" title))
new-url
input-text
)))
(make-response
(status-code ok)
#f
(time)
"text/html"
'()
(make-writer-body
(lambda (out options)
(format out HTML-page))
)))))
(define (make-result-page new-url)
(let ((HTML-page (format #f "
<HTML>
<TITLE>Result</TITLE>
<BODY>
<H1>Result</H1>
<P>
~a
<P>
<HR>
<A href=\"add-html.scm\">New calculation (new session)</A><BR>
<A href=\"javascript:history.back(2)\">New calculation (same session)</A><BR>
<A href=~s>Close this session</A>
</BODY>
</HTML>"
(number->string (+ (get-number1) (get-number2)))
new-url)))
(make-response
(status-code ok)
#f
(time)
"text/html"
'()
(make-writer-body
(lambda (out options)
(format out HTML-page)))
)))
(define (get-number input-text . maybe-title)
(let* ((title (if (pair? maybe-title) (car maybe-title) #f))
(result (send/suspend (make-get-number-page input-text title)))
(bindings (parse-html-form-query
(http-url-search (request-url result))))
(number (string->number
(extract-single-binding "number" bindings))))
(if number
number
(get-number input-text "Please enter a valid number"))))
(define (get-number1)
(get-number "First number:" "Calculation - Step one"))
(define (get-number2)
(get-number "Second number:" "Calculation - Step two"))
(define (main req)
(send/suspend make-result-page)
;; This finishes the session and does a redirect to the root
;; page.
(send/finish
(make-error-response (status-code moved-temp) req
"/" "/")))
))