def read(file: JFile): Content = { val bytes = Bytes.read(file) val file_name = file.getName val mime_type = file_mime_type(file)
apply(bytes, file_name = file_name, mime_type = mime_type)
}
def read(path: Path): Content = read(path.file)
}
class Content private( val bytes: Bytes, val file_name: String, val mime_type: String, val encoding: String, val elapsed_time: Time
) { def text: String = new String(bytes.make_array, encoding) def json: JSON.T = JSON.parse(text)
}
/** client **/
val NEWLINE: String = "\r\n"
object Client { val default_timeout: Time = Time.seconds(180)
def open_connection(
url: Url,
timeout: Time = default_timeout,
user_agent: String = ""
): HttpURLConnection = {
url.open_connection() match { case connection: HttpURLConnection => if (0 < timeout.ms && timeout.ms <= Int.MaxValue) { val ms = timeout.ms.toInt
connection.setConnectTimeout(ms)
connection.setReadTimeout(ms)
}
proper_string(user_agent).foreach(s => connection.setRequestProperty("User-Agent", s))
connection case _ => error("Bad URL (not HTTP): " + quote(url.toString))
}
}
def get_content(connection: HttpURLConnection): Content = { val Charset = """.*\bcharset="?([\S^"]+)"?.*""".r
val start = Time.now()
using(connection.getInputStream) { stream => val bytes = Bytes.read_stream(stream, hint = connection.getContentLength) val stop = Time.now()
val file_name = Url.file_name(Url(connection.getURL.toURI)) val mime_type = Option(connection.getContentType).getOrElse(Content.default_mime_type) val encoding =
(connection.getContentEncoding, mime_type) match { case (enc, _) if enc != null => enc case (_, Charset(enc)) => enc case _ => Content.default_encoding
}
Content(bytes, file_name = file_name, mime_type = mime_type,
encoding = encoding, elapsed_time = stop - start)
}
}
def uri_path: Option[Path] = for {
s <- Option(uri.getPath).flatMap(Library.try_unprefix(root, _)) if Path.is_wellformed(s)
p = Path.explode(s) if p.all_basic
} yield p
def apply(request: Request): Option[Response] = try { for {
json <-
Exn.capture(JSON.parse(request.input.text)) match { case Exn.Res(json) => Some(json) case _ =>
progress.echo("Could not parse: " + quote(request.input.text), verbose = true)
None
}
res <-
handle(json) match { case Some(res) => Some(res) case None =>
progress.echo("Invalid request: " + JSON.Format(json), verbose = true)
None
}
} yield Response(Bytes(JSON.Format(res)), content_type = "application/json")
} catch { case exn: Throwable => val uuid = UUID.random()
progress.echo_error_message("Server error <" + uuid + ">: " + exn)
Some(Response.text("internal server error: " + uuid))
}
}
/* server */
class Server private[HTTP](val name: String, val http_server: HttpServer) { def += (service: Service): Unit =
http_server.createContext(service.context(name), service.handler(name)) def -= (service: Service): Unit =
http_server.removeContext(service.context(name))
def start(): Unit = http_server.start() def stop(): Unit = http_server.stop(0)
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.39Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.