-
Notifications
You must be signed in to change notification settings - Fork 28
/
HttpConnection.scala
47 lines (36 loc) · 1.48 KB
/
HttpConnection.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package io.youi.http
import io.youi.server.Server
import io.youi.stream.Delta
import io.youi.{MapStore, Store}
class HttpConnection(val server: Server, val request: HttpRequest) {
private var responseVar: HttpResponse = HttpResponse()
private var finished = false
val store: Store = new MapStore()
def response: HttpResponse = responseVar
def update(f: HttpResponse => HttpResponse): Unit = synchronized {
responseVar = f(responseVar)
}
def isWebSocketUpgradeRequest: Boolean = Headers.`Connection`.all(request.headers).contains("Upgrade")
def webSocketSupport: Option[Connection] = store.get[Connection](Connection.key)
def webSocketSupport_=(listener: Connection): Unit = {
if (isWebSocketUpgradeRequest) {
store.update(Connection.key, listener)
update { response =>
response.copy(status = HttpStatus.SwitchingProtocols)
}
} else {
throw new RuntimeException(s"Not a WebSocket upgrade request! Expected 'Connection' set to 'Upgrade'. Headers: ${request.headers}")
}
}
object deltas {
private val key: String = "deltas"
def apply(): List[Delta] = store.getOrElse[List[Delta]](key, Nil)
def clear(): Unit = store.remove(key)
def +=(deltas: List[Delta]): Unit = store(key) = apply() ::: deltas
def +=(delta: Delta): Unit = this += List(delta)
def isEmpty: Boolean = apply().isEmpty
def nonEmpty: Boolean = apply().nonEmpty
}
def isFinished: Boolean = finished
def finish(): Unit = finished = true
}