extractOfferedWsProtocols

Signature

def extractOfferedWsProtocols: Directive1[immutable.Seq[String]] 

Description

Extracts the list of WebSocket subprotocols as offered by the client in the Sec-WebSocket-Protocol header if this is a WebSocket request. Rejects with an ExpectedWebSocketRequestRejectionExpectedWebSocketRequestRejection, otherwise.

The extractOfferedWsProtocols directive is used as a building block for Custom Directives to provide the extracted protocols to the inner route.

Example

Scala
sourcedef echoService: Flow[Message, Message, Any] =
  Flow[Message]
    // needed because a noop flow hasn't any buffer that would start processing in tests
    .buffer(1, OverflowStrategy.backpressure)

def route =
  path("services") {
    extractOfferedWsProtocols { protocols =>
      handleWebSocketMessagesForOptionalProtocol(echoService, protocols.headOption)
    }
  }

// tests:
val wsClient = WSProbe()

// WS creates a WebSocket request for testing
WS("/services", wsClient.flow, List("echo", "alfa", "kilo")) ~> route ~> check {
  expectWebSocketUpgradeWithProtocol { protocol =>
    protocol shouldEqual "echo"
    wsClient.sendMessage("ping")
    wsClient.expectMessage("ping")
    wsClient.sendCompletion()
    wsClient.expectCompletion()
  }
}
Java
sourceimport static org.apache.pekko.http.javadsl.server.Directives.extractOfferedWsProtocols;
import static org.apache.pekko.http.javadsl.server.Directives.handleWebSocketMessagesForOptionalProtocol;

final Flow<Message, Message, NotUsed> echoService =
    Flow.of(Message.class).buffer(1, OverflowStrategy.backpressure());

final Route websocketRoute =
    path(
        "services",
        () ->
            concat(
                extractOfferedWsProtocols(
                    protocols ->
                        handleWebSocketMessagesForOptionalProtocol(
                            echoService, protocols.stream().findFirst()))));

// tests:
// create a testing probe representing the client-side
final WSProbe wsClient = WSProbe.create(system(), materializer());

testRoute(websocketRoute)
    .run(
        WS(
            Uri.create("/services"),
            wsClient.flow(),
            materializer(),
            Arrays.asList("echo", "alfa", "kilo")))
    .assertHeaderExists(SecWebSocketProtocol.create("echo"));

wsClient.sendMessage("ping");
wsClient.expectMessage("ping");

wsClient.sendCompletion();
wsClient.expectCompletion();