OkHttpWebSocket.java

  1. /**
  2.  *
  3.  * Copyright 2020 Aditya Borikar, 2020-2021 Florian Schmaus
  4.  *
  5.  * Licensed under the Apache License, Version 2.0 (the "License");
  6.  * you may not use this file except in compliance with the License.
  7.  * You may obtain a copy of the License at
  8.  *
  9.  *     http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */
  17. package org.jivesoftware.smack.websocket.okhttp;

  18. import java.util.logging.Level;

  19. import javax.net.ssl.SSLSession;

  20. import org.jivesoftware.smack.c2s.internal.ModularXmppClientToServerConnectionInternal;
  21. import org.jivesoftware.smack.websocket.impl.AbstractWebSocket;
  22. import org.jivesoftware.smack.websocket.rce.WebSocketRemoteConnectionEndpoint;

  23. import okhttp3.OkHttpClient;
  24. import okhttp3.Request;
  25. import okhttp3.Response;
  26. import okhttp3.WebSocket;
  27. import okhttp3.WebSocketListener;

  28. public final class OkHttpWebSocket extends AbstractWebSocket {

  29.     private static final OkHttpClient OK_HTTP_CLIENT = new OkHttpClient();

  30.     private final WebSocket okHttpWebSocket;

  31.     OkHttpWebSocket(WebSocketRemoteConnectionEndpoint endpoint,
  32.                     ModularXmppClientToServerConnectionInternal connectionInternal) {
  33.         super(endpoint, connectionInternal);

  34.         final String url = endpoint.getRawString();
  35.         Request request = new Request.Builder()
  36.                               .url(url)
  37.                               .header(SEC_WEBSOCKET_PROTOCOL_HEADER_FILED_NAME, SEC_WEBSOCKET_PROTOCOL_HEADER_FILED_VALUE_XMPP)
  38.                               .build();

  39.         okHttpWebSocket = OK_HTTP_CLIENT.newWebSocket(request, listener);
  40.     }

  41.     private final WebSocketListener listener = new WebSocketListener() {

  42.         @Override
  43.         public void onOpen(WebSocket webSocket, Response response) {
  44.             LOGGER.log(Level.FINER, "OkHttp invoked onOpen() for {0}. Response: {1}",
  45.                             new Object[] { webSocket, response });
  46.             future.setResult(OkHttpWebSocket.this);
  47.         }

  48.         @Override
  49.         public void onMessage(WebSocket webSocket, String text) {
  50.             onIncomingWebSocketElement(text);
  51.         }

  52.         @Override
  53.         public void onFailure(WebSocket webSocket, Throwable throwable, Response response) {
  54.             LOGGER.log(Level.FINER, "OkHttp invoked onFailure() for " + webSocket + ". Response: " + response, throwable);
  55.             onWebSocketFailure(throwable);
  56.         }

  57.         @Override
  58.         public void onClosing(WebSocket webSocket, int code, String reason) {
  59.             LOGGER.log(Level.FINER, "OkHttp invoked onClosing() for " + webSocket + ". Code: " + code + ". Reason: " + reason);
  60.         }

  61.         @Override
  62.         public void onClosed(WebSocket webSocket, int code, String reason) {
  63.             LOGGER.log(Level.FINER, "OkHttp invoked onClosed() for " + webSocket + ". Code: " + code + ". Reason: " + reason);
  64.         }

  65.     };

  66.     @Override
  67.     public void send(String element) {
  68.         okHttpWebSocket.send(element);
  69.     }

  70.     @Override
  71.     public void disconnect(int code, String message) {
  72.         LOGGER.log(Level.INFO, "WebSocket closing with code: " + code + " and message: " + message);
  73.         okHttpWebSocket.close(code, message);
  74.     }

  75.     @Override
  76.     public SSLSession getSSLSession() {
  77.         // TODO: What shall we do about this method, as it appears that OkHttp does not provide access to the used SSLSession?
  78.         return null;
  79.     }
  80. }