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

113 lines
2.7 KiB
Scheme
Raw Normal View History

2003-01-19 11:57:27 -05:00
(define-structure surflet surflet-interface
(open httpd-requests ; REQUEST-URL
httpd-responses ; MAKE-RESPONSE
parse-html-forms ; PARSE-HTML-FORM-QUERY
url ; HTTP-URL-SEARCH
srfi-1 ; FILTER
2003-01-19 11:57:27 -05:00
surflet-handler/surflet ; 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)
(make-response
(status-code ok)
#f
(time)
"text/html"
'()
(make-writer-body
(lambda (out options)
(format out "
<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
))
))))
(define (make-result-page new-url)
(make-response
(status-code ok)
#f
(time)
"text/html"
'()
(make-writer-body
(lambda (out options)
(format out "
<HTML>
<TITLE>Result</TITLE>
<BODY>
2003-01-16 07:09:49 -05:00
<H2>Result</H2>
<P>
~a
<P>
<HR>
<A href=\"add-html.scm\">New calculation (new session)</A><BR>
2003-01-19 12:26:56 -05:00
<A href=\"javascript:history.go(-2)\">New calculation (same session)</A><BR>
<A href=~s>Close this session</A>
</BODY>
</HTML>"
(number->string (+ (get-number1) (get-number2)))
new-url)))
))
(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
"/" "/")))
))