[racket] Redirecting inbound HTTP-schemed urls to HTTPS-schemed urls in #lang web-server with SSL

From: Galler (lzgaller at optonline.net)
Date: Thu Apr 19 11:28:42 EDT 2012

When using stateless web servlets in #lang webserver with serve/servlet:

Q: Is there a method for identifying the uri-scheme of the inbound 
request and redirecting HTTP schemed uris to HTTPS scheme for SSL?

Issue 1)

Examining the (url-scheme (request-uri  request))  of the request start 
passed to the servlet's start function returns #f.

Issue 2)

start function is never called if an HTTP-schemed URI reached a servlet 
configured with:

#:ssl? #t
#:ssl-cert (build-path "my-cert.crt")
#:ssl-key (build-path "myprivatekey.key")

instead, a

Connection error: ssl-accept/enable-break: accept failed 
(error:1407609C:SSL routines:SSL23_GET_CLIENT_HELLO:http request)

is raised on the connection thread.

[note that servlet works as expected with HTTPS-schemed URI. this is 
absolutely not a PKI, certificate, or OpenSSL problem]

Thanks very much.


Here's an example demonstrating the #f value for url-scheme:

>>>>>>>>>>>>>>>>>>>

#lang web-server

(provide/contract (start (request? . -> . response?)))

(define (start request)
   (printf "url-scheme is ~A\n" (url-scheme (request-uri request)))
   (response/xexpr
    `(html (head (title "Hello world!"))
           (body (p "Hi Jay")))))


(require web-server/servlet-env)
(serve/servlet start
                #:stateless? #t
                #:launch-browser? #f
                #:connection-close? #t
                #:quit? #f
                #:listen-ip #f
                 #:servlet-path "/")


+++++++++++++++++++++++++++++

>> url-scheme is #f

Posted on the users mailing list.