播放框架-在Web套接字响应标题中编辑Sec-WebSocket-Protocol

时间:2019-07-17 06:50:32

标签: scala websocket playframework akka

编辑从服务器发送到客户端的Web套接字标头响应。

我正在使用playframework创建一个websocket服务器应用程序。现在,来自服务器的websocket响应是 由Play照顾。以下是响应头,

Request Header:
  (UpgradeToWebSocket,),
  (Host,localhost:8083), 
  (Connection,Upgrade), 
  (Upgrade,websocket),
  (Sec-WebSocket-Version,13), 
  (Accept-Encoding,gzip, deflate, br), 
  (Accept-Language,en-US,en;q=0.9),
  (Sec-WebSocket-Key,ZvfzpVo3EX4DFA4BRcgRIA==)

def chatSystem(): WebSocket = WebSocket.acceptOrResult[String, String] { request =>
    Future.successful{
      AuthenticationService.doBasicAuthentication(request.headers) match {
        case Results.Ok => Right(ActorFlow.actorRef { out => ChatServiceActor.props(out) })
        case _ => Left(Unauthorized)
      }
    }
 }

我想验证 Sec-WebSocket-Protocol ,如果请求标头中存在它,或者如果不存在,则在服务器响应中添加它。

1 个答案:

答案 0 :(得分:0)

我使用了以下代码:

// Defined at http://tools.ietf.org/html/rfc6455#section-4.2.2
val MagicGuid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"

def websocketAcceptForKey(key: String): String = {
  val sha1 = MessageDigest.getInstance("sha1")
  val salted = key + MagicGuid
  val hash = sha1.digest(salted.asciiBytes)
  val acceptKey: String = Base64.rfc2045().encodeToString(hash, false)
  acceptKey
}

使用它的方式如下:

val wsKey: Optional[HttpHeader] = request.getHeader("Sec-WebSocket-Key")
val wsAccept = if (wsKey.isPresent) Some(RawHeader("Sec-WebSocket-Accept", websocketAcceptForKey(wsKey.get.value()))) else None