src/Pure/General/http.scala
author wenzelm
Thu, 02 Mar 2017 12:31:07 +0100
changeset 65077 2d6e716c9d6e
parent 65076 src/Pure/General/http_server.scala@8a96ab58f016
child 65078 2339994e8790
permissions -rw-r--r--
clarified modules;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
65077
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
     1
/*  Title:      Pure/General/http.scala
63823
ca8b737b08cf minimal HTTP server;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
ca8b737b08cf minimal HTTP server;
wenzelm
parents:
diff changeset
     3
65077
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
     4
HTTP server support.
63823
ca8b737b08cf minimal HTTP server;
wenzelm
parents:
diff changeset
     5
*/
ca8b737b08cf minimal HTTP server;
wenzelm
parents:
diff changeset
     6
ca8b737b08cf minimal HTTP server;
wenzelm
parents:
diff changeset
     7
package isabelle
ca8b737b08cf minimal HTTP server;
wenzelm
parents:
diff changeset
     8
ca8b737b08cf minimal HTTP server;
wenzelm
parents:
diff changeset
     9
ca8b737b08cf minimal HTTP server;
wenzelm
parents:
diff changeset
    10
import java.net.{InetAddress, InetSocketAddress}
ca8b737b08cf minimal HTTP server;
wenzelm
parents:
diff changeset
    11
import com.sun.net.httpserver.{HttpExchange, HttpHandler, HttpServer}
ca8b737b08cf minimal HTTP server;
wenzelm
parents:
diff changeset
    12
ca8b737b08cf minimal HTTP server;
wenzelm
parents:
diff changeset
    13
65077
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    14
object HTTP
63823
ca8b737b08cf minimal HTTP server;
wenzelm
parents:
diff changeset
    15
{
65077
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    16
  /* handler */
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    17
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    18
  class Handler private[HTTP](val path: String, val handler: HttpHandler)
65076
8a96ab58f016 clarified signature;
wenzelm
parents: 63823
diff changeset
    19
  {
8a96ab58f016 clarified signature;
wenzelm
parents: 63823
diff changeset
    20
    override def toString: String = path
8a96ab58f016 clarified signature;
wenzelm
parents: 63823
diff changeset
    21
  }
8a96ab58f016 clarified signature;
wenzelm
parents: 63823
diff changeset
    22
65077
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    23
  def handler(path: String, body: HttpExchange => Unit): Handler =
65076
8a96ab58f016 clarified signature;
wenzelm
parents: 63823
diff changeset
    24
    new Handler(path, new HttpHandler { def handle(x: HttpExchange) { body(x) } })
8a96ab58f016 clarified signature;
wenzelm
parents: 63823
diff changeset
    25
65077
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    26
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    27
  /* server */
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    28
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    29
  class Server private[HTTP](val http_server: HttpServer)
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    30
  {
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    31
    def += (handler: Handler) { http_server.createContext(handler.path, handler.handler) }
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    32
    def -= (handler: Handler) { http_server.removeContext(handler.path) }
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    33
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    34
    def start: Unit = http_server.start
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    35
    def stop: Unit = http_server.stop(0)
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    36
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    37
    def address: InetSocketAddress = http_server.getAddress
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    38
    def url: String = "http://" + address.getHostName + ":" + address.getPort
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    39
    override def toString: String = url
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    40
  }
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    41
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    42
  def server(handlers: Handler*): Server =
63823
ca8b737b08cf minimal HTTP server;
wenzelm
parents:
diff changeset
    43
  {
ca8b737b08cf minimal HTTP server;
wenzelm
parents:
diff changeset
    44
    val localhost = InetAddress.getByName("127.0.0.1")
65077
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    45
    val http_server = HttpServer.create(new InetSocketAddress(localhost, 0), 0)
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    46
    http_server.setExecutor(null)
65076
8a96ab58f016 clarified signature;
wenzelm
parents: 63823
diff changeset
    47
65077
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    48
    val server = new Server(http_server)
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    49
    for (handler <- handlers) server += handler
2d6e716c9d6e clarified modules;
wenzelm
parents: 65076
diff changeset
    50
    server
63823
ca8b737b08cf minimal HTTP server;
wenzelm
parents:
diff changeset
    51
  }
ca8b737b08cf minimal HTTP server;
wenzelm
parents:
diff changeset
    52
}