Após mover de quarkus-websocket
para quarkus-websockets-next
, qualquer HTTP GET para um @WebSocket
caminho agora apresenta erros com
"Connection" header must be "Upgrade"
Isso ocorre porque a nova extensão intercepta todas as solicitações correspondentes e as trata como um handshake WebSocket.
No quarkus-websocket
modelo antigo, @ServerEndpoint
apenas atualizações verdadeiras do WebSocket eram processadas; GETs simples para o mesmo URL caíam nos recursos JAX-RS.
Com quarkus-websockets-next
, @WebSocket(path="/…")
instala um único manipulador Vert.x para todos os métodos HTTP naquele caminho. Um GET padrão — sem o cabeçalho Connection: Upgrade necessário — é detectado e rejeitado antes que qualquer lógica REST possa ser executada.
Abaixo está um projeto mínimo do Quarkus mostrando:
Legado (
quarkus-websockets
):- Um
@GET /chat
ponto de extremidade REST - Um JSR-356 WebSocket
@ServerEndpoint("/chat")
→ GET funciona (200 OK
), WS funciona
- Um
Próximo (
quarkus-websockets-next
):- Mesmo recurso REST
- Novo
@WebSocket(path = "/chat")
→ QualquerGET /chat
falha agora com
"Connection" header must be "Upgrade"
Reprodução de amostra usando:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-websockets</artifactId>
</dependency>
ChatResource.java
:
@Path("/chat")
@ApplicationScoped
public class ChatResource {
@GET
public String hello() {
return "Hello from REST!";
}
}
ChatEndpoint.java
:
@ServerEndpoint("/chat")
@ApplicationScoped
public class ChatEndpoint {
@OnOpen
public void onOpen(Session session) { /*...*/ }
@OnMessage
public void onMessage(Session session, String msg) {
session.getAsyncRemote().sendText("Echo:" + msg);
}
}
Comportamento
OBTER http://localhost:8080/chat → 200 OK com “Olá do REST!”
ws://localhost:8080/chat → O handshake do WebSocket foi bem-sucedido
Com o novo quarkus-websockets-next
:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-websockets-next</artifactId>
</dependency>
ChatResource.java (unchanged)
:
@Path("/chat")
@ApplicationScoped
public class ChatResource {
@GET
public String hello() {
return "Hello from REST!";
}
}
ChatSocket.java
:
@WebSocket(path = "/chat")
@ApplicationScoped
public class ChatSocket {
@OnOpen
public void onOpen(WebSocketConnection conn) { /*...*/ }
@OnMessage
public void onMessage(WebSocketConnection conn, String msg) {
conn.sendText("Echo:" + msg).subscribe().with(r -> {}, t -> {});
}
}
Comportamento
GET http://localhost:8080/chat → falha com
"Connection" header must be "Upgrade"
ws://localhost:8080/chat → O handshake do WebSocket foi bem-sucedido
Isso é esperado quarkus-websockets-next
ou é um bug? Porque estou implementando alguns endpoints para uma especificação padrão, onde posso ter endpoints mais ou menos assim:
/queries/{queryName}/events
De acordo com a especificação, ele deve fazer o seguinte:
Returns all events that match the query or creates a new Websocket subscription.
Isso estava funcionando com o quarkus-websockets
e agora está falhando na solicitação GET, o que é quarkus-websockets-next
um pouco confuso se esse é um problema que precisa ser corrigido.