Last active
March 28, 2016 04:44
-
-
Save seralf/c7189d0ce467bad222b7 to your computer and use it in GitHub Desktop.
minimal scala HTTP server (proof of concept, for courses)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) } | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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