io.grpc.okhttp.internal.Protocol Maven / Gradle / Ivy
/*
* Copyright (C) 2014 Square, 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.
*/
/*
* Forked from OkHttp 2.5.0
*/
package io.grpc.okhttp.internal;
import java.io.IOException;
/**
* Protocols that OkHttp implements for ALPN
* selection.
*
* Protocol vs Scheme
* Despite its name, {@link java.net.URL#getProtocol()} returns the
* {@linkplain java.net.URI#getScheme() scheme} (http, https, etc.) of the URL, not
* the protocol (http/1.1, spdy/3.1, etc.). OkHttp uses the word protocol
* to identify how HTTP messages are framed.
*/
public enum Protocol {
/**
* An obsolete plaintext framing that does not use persistent sockets by
* default.
*/
HTTP_1_0("http/1.0"),
/**
* A plaintext framing that includes persistent connections.
*
* This version of OkHttp implements RFC 2616, and tracks
* revisions to that spec.
*/
HTTP_1_1("http/1.1"),
/**
* Chromium's binary-framed protocol that includes header compression,
* multiplexing multiple requests on the same socket, and server-push.
* HTTP/1.1 semantics are layered on SPDY/3.
*
*
This version of OkHttp implements SPDY 3 draft
* 3.1. Future releases of OkHttp may use this identifier for a newer draft
* of the SPDY spec.
*/
SPDY_3("spdy/3.1"),
/**
* The IETF's binary-framed protocol that includes header compression,
* multiplexing multiple requests on the same socket, and server-push.
* HTTP/1.1 semantics are layered on HTTP/2.
*
*
HTTP/2 requires deployments of HTTP/2 that use TLS 1.2 support
* {@linkplain CipherSuite#TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256}
* , present in Java 8+ and Android 5+. Servers that enforce this may send an
* exception message including the string {@code INADEQUATE_SECURITY}.
*/
HTTP_2("h2"),
/**
* The experimental "grpc-exp" string identifies gRPC (and by implication
* HTTP/2) when used over TLS. This indicates to the server that the client
* will only send gRPC traffic on the h2 connection and is negotiated in
* preference to h2 when the client and server support it, but is not
* standardized. Support for this may be removed at any time.
*/
GRPC_EXP("grpc-exp");
private final String protocol;
Protocol(String protocol) {
this.protocol = protocol;
}
/**
* Returns the protocol identified by {@code protocol}.
* @throws IOException if {@code protocol} is unknown.
*/
public static Protocol get(String protocol) throws IOException {
// Unroll the loop over values() to save an allocation.
if (protocol.equals(HTTP_1_0.protocol)) return HTTP_1_0;
if (protocol.equals(HTTP_1_1.protocol)) return HTTP_1_1;
if (protocol.equals(HTTP_2.protocol)) return HTTP_2;
if (protocol.equals(GRPC_EXP.protocol)) return GRPC_EXP;
if (protocol.equals(SPDY_3.protocol)) return SPDY_3;
throw new IOException("Unexpected protocol: " + protocol);
}
/**
* Returns the string used to identify this protocol for ALPN, like
* "http/1.1", "spdy/3.1" or "h2".
*/
@Override public String toString() {
return protocol;
}
}