rrees / ScaticServe

A basic static webserver written in Scala for fun.

Clone this repository (size: 286.8 KB): HTTPS / SSH
$ hg clone http://bitbucket.org/rrees/scaticserve/
commit 3: 3635309e1c9a
parent 2: ab158f8fca1e
branch: default
tags: tip
Correcting a repo sync issue where the code was reverted on the server not on the client
rr...@thoughtw-bbf12b
14 months ago
r3:3635309e1c9a 81 loc 2.2 KB embed / history / annotate / raw /
package scalawebserver

  import java.net._
  import com.sun.net.httpserver._

  class Handler extends HttpHandler {
    import java.io._
    import java.nio._
    import scala.io.Source

    val responseCodes = Map (
      "200" -> 200, "404" -> 404
    )

    val mimeTypes = Map (
        "html" -> "text/html", "png" -> "image/png")

    val Page404 = <html><head><title>Page Not Found</title></head><body><p>Sorry but that resource does not exist</p></body></html>
    val rootDir = new File("htdocs")

    def handle(exchange: HttpExchange) {

        val writer = new BufferedWriter(new OutputStreamWriter(exchange.getResponseBody()))

        val requestedFile = new File(rootDir, exchange.getRequestURI().toString().substring(1))
        val requestedExtension = exchange.getRequestURI().toString().split("\\.").reverse(0)

        if(requestedFile.canRead()) {

            val list = new java.util.ArrayList[String]()

            list.add(mimeTypes(requestedExtension))

            exchange.getResponseHeaders.put("Content-Type: ", list)
            exchange.sendResponseHeaders(responseCodes("200"), 0)

            if(requestedExtension.equals("html")) {
                Source.fromFile(requestedFile).getLines.foreach(writer.write)
            } else {
                val input = new DataInputStream(new FileInputStream(requestedFile))
                val output = new DataOutputStream(exchange.getResponseBody())
                val buffer: Array[Byte] = new Array[Byte](1024)

                while((input.read(buffer)) != -1) {
                    output.write(buffer);
                }
            }

        } else {
            exchange.sendResponseHeaders(responseCodes("404"), 0)
            writer.write(Page404.toString());
        }

        writer.flush()

        exchange.close()
    }
  }

object Main {


  /**
   * @param args the command line arguments
   */
  def main(args: Array[String]) = {

    println("Hello, world!")

    val server = HttpServer.create(new InetSocketAddress(6666), 10)

    server.createContext("/", new Handler())

    server.start
    Console.println("Press return to stop the server")
    while(Console.readLine() == null) {}

    server.stop(0)
  }

}