Skip to content

Instantly share code, notes, and snippets.

@seralf
Last active March 28, 2016 04:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save seralf/c7189d0ce467bad222b7 to your computer and use it in GitHub Desktop.
Save seralf/c7189d0ce467bad222b7 to your computer and use it in GitHub Desktop.
minimal scala HTTP server (proof of concept, for courses)
object FolderHelper {
def list_files(item: File): Stream[File] = {
item match {
case file if (file.isFile()) => Stream(file)
case dir if (dir.isDirectory()) =>
Stream(dir) ++ dir.listFiles().toStream.flatMap { el => list_files(el) }
}
}
}
package scala.examples.web
import java.net.InetSocketAddress
import java.util.concurrent.Executors
import com.sun.net.httpserver.HttpExchange
import com.sun.net.httpserver.HttpHandler
import com.sun.net.httpserver.HttpServer
import java.io.BufferedReader
import java.io.InputStreamReader
import java.net.InetAddress
import java.net.URLDecoder
import scala.util.parsing.json.JSONObject
import scala.collection.JavaConversions._
import scala.collection.JavaConverters._
import scala.util.parsing.json.JSONArray
import java.util.logging.Logger
import java.util.logging.Level
import com.sun.net.httpserver.Headers
object MinimalHTTPServer extends App {
val logger = Logger.getLogger(MinimalHTTPServer.getClass.toString())
var hits = 0
val executor = Executors.newSingleThreadExecutor()
val server = HttpServer.create(new InetSocketAddress(8888), 0)
server.createContext("/test", new HttpHandler() {
def parseParams(exchange: HttpExchange) = {
exchange.getRequestURI().getQuery
.split("&").toList
.foldRight(Map.empty[String, String])((qp, map) => {
val p = qp.split("=").map { x => URLDecoder.decode(x, "UTF-8") }
map + (p(0) -> p(1))
})
}
def parseHeaders(exchange: HttpExchange) = {
exchange.getRequestHeaders
.map { h =>
val values = h._2.toList
if (values.size > 1)
(h._1, JSONArray(values))
else
(h._1, values(0))
}
.toMap
}
override def handle(exchange: HttpExchange) {
val uri = exchange.getRequestURI()
val msg = s"REQUEST[$hits]: $uri"
val query = uri.getQuery
val params = parseParams(exchange)
val headers = parseHeaders(exchange)
val json = JSONObject(Map(
"msg" -> msg,
"query" -> query,
"params" -> JSONObject(params),
"headers" -> JSONObject(headers)))
logger.log(Level.INFO, json.toString())
exchange.sendResponseHeaders(200, json.toString().length())
val os = exchange.getResponseBody()
os.write(json.toString().getBytes())
os.flush()
os.close()
hits = hits + 1
}
})
server.setExecutor(executor); // creates a default executor
server.start();
}
package scala.examples.web
import java.net.InetSocketAddress
import java.util.concurrent.Executors
import com.sun.net.httpserver.HttpExchange
import com.sun.net.httpserver.HttpHandler
import com.sun.net.httpserver.HttpServer
import java.io.BufferedReader
import java.io.InputStreamReader
import java.net.InetAddress
import java.net.URLDecoder
import scala.util.parsing.json.JSONObject
import scala.collection.JavaConversions._
import scala.collection.JavaConverters._
import scala.util.parsing.json.JSONArray
import java.util.logging.Logger
import java.util.logging.Level
import com.sun.net.httpserver.Headers
import java.awt.Color
import scala.util.parsing.json.JSONObject
object MinimalHTTPServer_with_HTML extends App {
val logger = Logger.getLogger(MinimalHTTPServer.getClass.toString())
var hits = 0
val executor = Executors.newSingleThreadExecutor()
val server = HttpServer.create(new InetSocketAddress(8888), 0)
server.createContext("/test", new HttpHandler() {
def parseParams(exchange: HttpExchange) = {
exchange.getRequestURI().getQuery
.split("&").toList
.foldRight(Map.empty[String, String])((qp, map) => {
val p = qp.split("=").map { x => URLDecoder.decode(x, "UTF-8") }
map + (p(0) -> p(1))
})
}
def parseHeaders(exchange: HttpExchange) = {
exchange.getRequestHeaders
.map { h =>
val values = h._2.toList
if (values.size > 1)
(h._1, JSONArray(values))
else
(h._1, values(0))
}
.toMap
}
override def handle(exchange: HttpExchange) {
val uri = exchange.getRequestURI()
val msg = s"REQUEST[$hits]: $uri"
val query = uri.getQuery
val params = parseParams(exchange)
val headers = parseHeaders(exchange)
val map = Map(
"msg" -> msg,
"query" -> query,
"params" -> params,
"headers" -> headers)
logger.log(Level.INFO, map.toString())
val user = params.get("user").get
val color = params.get("color").get
val html = HTMLPage(
"this is the example page! :-)",
user,
color,
map.mkString("\n"))
.html.toString()
exchange.sendResponseHeaders(200, html.length())
val os = exchange.getResponseBody()
os.write(html.getBytes)
os.flush()
os.close()
hits = hits + 1
}
})
server.setExecutor(executor); // creates a default executor
server.start();
}
case class HTMLPage(title: String, user: String, bgcolor: String = "#FFF", json: String = "{}") {
val css = """
#json{
width: 60%; height: auto;
padding: 2em 1em;
overflow: scroll;
}
"""
def message = s"Welcome <b>$user</b>! :-)"
val html =
<html>
<head>
<meta charset="utf-8"/>
<style>{ css }</style>
</head>
<body>
<p style={ "background-color: " + bgcolor }>{ message }</p>
<script src="//d3js.org/d3.v3.min.js"></script>
<script>
d3.select('body').append('span').text('Hello, world!').style('background-color', '#FF0');
</script>
<pre id="json">{ json.toString() }</pre>
</body>
</html>
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment