All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.fabric8.kubernetes.client.okhttp.OkHttpWebSocketImpl Maven / Gradle / Ivy

/**
 * Copyright (C) 2015 Red Hat, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package io.fabric8.kubernetes.client.okhttp;

import io.fabric8.kubernetes.client.http.WebSocket;
import io.fabric8.kubernetes.client.http.WebSocketHandshakeException;
import io.fabric8.kubernetes.client.okhttp.OkHttpClientImpl.OkHttpResponseImpl;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.WebSocketListener;
import okio.ByteString;

import java.io.IOException;
import java.net.URI;
import java.nio.ByteBuffer;
import java.util.concurrent.CompletableFuture;

class OkHttpWebSocketImpl implements WebSocket {

  static class BuilderImpl implements WebSocket.Builder {

    private Request.Builder builder = new Request.Builder();
    private OkHttpClient httpClient;

    public BuilderImpl(OkHttpClient httpClient) {
      this.httpClient = httpClient;
    }

    @Override
    public Builder uri(URI uri) {
      builder.url(HttpUrl.get(uri));
      return this;
    }

    @Override
    public CompletableFuture buildAsync(Listener listener) {
      Request request = builder.build();
      CompletableFuture future = new CompletableFuture<>();
      httpClient.newWebSocket(request, new WebSocketListener() {
        private volatile boolean opened;

        @Override
        public void onFailure(okhttp3.WebSocket webSocket, Throwable t, Response response) {
          if (response != null) {
            response.close();
          }
          if (!opened) {
            if (response != null) {
              try {
                future.completeExceptionally(
                    new WebSocketHandshakeException(new OkHttpResponseImpl<>(response, null)).initCause(t));
              } catch (IOException e) {
                // can't happen
              }
            } else {
              future.completeExceptionally(t);
            }
          } else {
            listener.onError(new OkHttpWebSocketImpl(webSocket), t);
          }
        }

        @Override
        public void onOpen(okhttp3.WebSocket webSocket, Response response) {
          opened = true;
          if (response != null) {
            response.close();
          }
          OkHttpWebSocketImpl value = new OkHttpWebSocketImpl(webSocket);
          listener.onOpen(value);
          future.complete(value);
        }

        @Override
        public void onMessage(okhttp3.WebSocket webSocket, ByteString bytes) {
          listener.onMessage(new OkHttpWebSocketImpl(webSocket), bytes.asByteBuffer());
        }

        @Override
        public void onMessage(okhttp3.WebSocket webSocket, String text) {
          listener.onMessage(new OkHttpWebSocketImpl(webSocket), text);
        }

        @Override
        public void onClosing(okhttp3.WebSocket webSocket, int code, String reason) {
          listener.onClose(new OkHttpWebSocketImpl(webSocket), code, reason);
        }

      });
      return future;
    }

    @Override
    public WebSocket.Builder header(String name, String value) {
      builder = builder.addHeader(name, value);
      return this;
    }

    @Override
    public WebSocket.Builder setHeader(String k, String v) {
      builder = builder.header(k, v);
      return this;
    }

  }

  private okhttp3.WebSocket webSocket;

  public OkHttpWebSocketImpl(okhttp3.WebSocket webSocket) {
    this.webSocket = webSocket;
  }

  @Override
  public boolean send(ByteBuffer buffer) {
    return webSocket.send(ByteString.of(buffer));
  }

  @Override
  public boolean sendClose(int code, String reason) {
    return webSocket.close(code, reason);
  }

  @Override
  public long queueSize() {
    return webSocket.queueSize();
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy