REBOL [
    Title: "Micro Web Server"
    Date: 10-Jun-2000
    File: %webserver.r
    Purpose: {
        Here is a web server that works quite well and can be
        run from just about any machine. It's not only fast,
        but its also small so it's easy to enhance.
    }
    History: [
    10-Jun-2000 "Buffers the entire request, adds address" 
    22-Jun-1999 "First posted"
]
    Notes: {
        Set the web-dir to point to the file directory that
        contains your web site files, such as index.html.
    }
    library: [
        level: 'intermediate 
        platform: none 
        type: none 
        domain: [web other-net] 
        tested-under: none 
        support: none 
        license: none 
        see-also: none
    ]
]

web-dir: %.   ; the path to where you store your web files

listen-port: open/lines tcp://:80  ; port used for web connections

errors: [
    400 "Forbidden" "No permission to access:"
    404 "Not Found" "File was not found:"
]

send-error: function [err-num file] [err] [
    err: find errors err-num
    insert http-port join "HTTP/1.0 " [
        err-num " " err/2 "^/Content-type: text/html^/^/" 
          err/2 
        "

SERVER-ERROR

REBOL Webserver Error:" err/3 " " file newline

] ] send-page: func [data mime] [ insert data rejoin ["HTTP/1.0 200 OK^/Content-type: " mime "^/^/"] write-io http-port data length? data ] buffer: make string! 1024 ; will auto-expand if needed forever [ http-port: first wait listen-port clear buffer while [not empty? request: first http-port][ repend buffer [request newline] ] repend buffer ["Address: " http-port/host newline] print buffer file: "index.html" mime: "text/plain" parse buffer ["get" ["http" | "/ " | copy file to " "]] parse file [thru "." [ "html" (mime: "text/html") | "gif" (mime: "image/gif") | "jpg" (mime: "image/jpeg") ] ] any [ if not exists? web-dir/:file [send-error 404 file] if error? try [data: read/binary web-dir/:file] [send-error 400 file] send-page data mime ] close http-port ]