extractWebSocketUpgrade

Signature

def extractWebSocketUpgrade: Directive1[WebSocketUpgrade]

Description

The extractWebSocketUpgrade directive is used as a building block for Custom Directives to provide the websocket upgrade information to the inner route.

Example

Scala
sourceimport akka.http.scaladsl.model.AttributeKeys.webSocketUpgrade

def 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") {
    extractWebSocketUpgrade { upgrade =>
      complete(upgrade.handleMessages(echoService, Some("echo")))
    }
  }

// tests:
val wsClient = WSProbe()

// WS creates a WebSocket request for testing
WS("/services", wsClient.flow, Nil) ~> route ~> check {
  expectWebSocketUpgradeWithProtocol { protocol =>
    protocol shouldEqual "echo"
    wsClient.sendMessage("ping")
    wsClient.expectMessage("ping")
    wsClient.sendCompletion()
    wsClient.expectCompletion()
  }
}
Java
sourcefinal Flow<Message, Message, NotUsed> echoService = Flow.of(Message.class).buffer(1, OverflowStrategy.backpressure());

final Route websocketRoute = path("services", () ->
  concat(
    extractWebSocketUpgrade(upgrade ->
      complete(upgrade.handleMessagesWith(echoService, "echo"))
    )
  )
);

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

// WS creates a WebSocket request for testing
testRoute(websocketRoute)
  .run(WS(Uri.create("/services"), wsClient.flow(), materializer(), Collections.emptyList()))
  .assertHeaderExists(SecWebSocketProtocol.create("echo"));

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

wsClient.sendCompletion();
wsClient.expectCompletion();
Found an error in this documentation? The source code for this page can be found here. Please feel free to edit and contribute a pull request.