64 } |
64 } |
65 |
65 |
66 def handler(root: String, body: Exchange => Unit): Handler = |
66 def handler(root: String, body: Exchange => Unit): Handler = |
67 new Handler(root, new HttpHandler { def handle(x: HttpExchange) { body(new Exchange(x)) } }) |
67 new Handler(root, new HttpHandler { def handle(x: HttpExchange) { body(new Exchange(x)) } }) |
68 |
68 |
69 def get(root: String, body: URI => Option[Response]): Handler = |
69 |
|
70 /* particular methods */ |
|
71 |
|
72 sealed case class Arg(method: String, uri: URI, request: Bytes) |
|
73 { |
|
74 def decode_properties: Properties.T = |
|
75 Library.space_explode('&', request.text).map(s => |
|
76 Library.space_explode('=', s) match { |
|
77 case List(a, b) => |
|
78 URLDecoder.decode(a, UTF8.charset_name) -> |
|
79 URLDecoder.decode(b, UTF8.charset_name) |
|
80 case _ => error("Malformed key-value pair in HTTP/POST: " + quote(s)) |
|
81 }) |
|
82 } |
|
83 |
|
84 def method(name: String, root: String, body: Arg => Option[Response]): Handler = |
70 handler(root, http => |
85 handler(root, http => |
71 { |
86 { |
72 http.read_request() |
87 val request = http.read_request() |
73 if (http.request_method == "GET") |
88 if (http.request_method == name) { |
74 Exn.capture(body(http.request_uri)) match { |
89 val arg = Arg(name, http.request_uri, request) |
|
90 Exn.capture(body(arg)) match { |
75 case Exn.Res(Some(response)) => |
91 case Exn.Res(Some(response)) => |
76 http.write_response(200, response) |
92 http.write_response(200, response) |
77 case Exn.Res(None) => |
93 case Exn.Res(None) => |
78 http.write_response(404, Response.empty) |
94 http.write_response(404, Response.empty) |
79 case Exn.Exn(ERROR(msg)) => |
95 case Exn.Exn(ERROR(msg)) => |
80 http.write_response(500, Response.text(Output.error_message_text(msg))) |
96 http.write_response(500, Response.text(Output.error_message_text(msg))) |
81 case Exn.Exn(exn) => throw exn |
97 case Exn.Exn(exn) => throw exn |
82 } |
98 } |
|
99 } |
83 else http.write_response(400, Response.empty) |
100 else http.write_response(400, Response.empty) |
84 }) |
101 }) |
|
102 |
|
103 def get(root: String, body: Arg => Option[Response]): Handler = method("GET", root, body) |
|
104 def post(root: String, body: Arg => Option[Response]): Handler = method("POST", root, body) |
85 |
105 |
86 |
106 |
87 /* server */ |
107 /* server */ |
88 |
108 |
89 class Server private[HTTP](val http_server: HttpServer) |
109 class Server private[HTTP](val http_server: HttpServer) |