elsif (ord(substr($reqline, 0, 1)) == 128 && !$use_ssl) { # This could be an https request when it should be http .. # need to fake a HTTP response eval <<'EOF'; use Net::SSLeay; eval "Net::SSLeay::SSLeay_add_ssl_algorithms()"; eval "Net::SSLeay::load_error_strings()"; $ssl_ctx = Net::SSLeay::CTX_new(); Net::SSLeay::CTX_use_RSAPrivateKey_file( $ssl_ctx, $config{'keyfile'}, &Net::SSLeay::FILETYPE_PEM); Net::SSLeay::CTX_use_certificate_file( $ssl_ctx, $config{'certfile'} || $config{'keyfile'}, &Net::SSLeay::FILETYPE_PEM); $ssl_con = Net::SSLeay::new($ssl_ctx); pipe(SSLr, SSLw); if (!fork()) { close(SSLr); select(SSLw); $| = 1; select(STDOUT); print SSLw $origreqline; local $buf; while(sysread(SOCK, $buf, 1) > 0) { print SSLw $buf; } close(SOCK); exit; } close(SSLw); Net::SSLeay::set_wfd($ssl_con, fileno(SOCK)); Net::SSLeay::set_rfd($ssl_con, fileno(SSLr)); Net::SSLeay::accept($ssl_con) || die "accept() failed"; $use_ssl = 1; local $url = $config{'musthost'} ? "https://$config{'musthost'}:$port/" : "https://$host:$port/"; if ($config{'ssl_redirect'}) { # Just re-direct to the correct URL &write_data("HTTP/1.0 302 Moved Temporarily\r\n"); &write_data("Date: $datestr\r\n"); &write_data("Server: $config{'server'}\r\n"); &write_data("Location: $url\r\n"); &write_keep_alive(0); &write_data("\r\n"); return 0; } else { # Tell user the correct URL &http_error(200, "Bad Request", "This web server is not running in SSL mode. Try the URL $url instead.
"); } EOF if ($@) { &http_error(400, "Bad Request"); } } else { &http_error(400, "Bad Request"); } }