/*
 * 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.
 */
package okhttp3;

import java.io.IOException;

Protocols that OkHttp implements for ALPN selection.

Protocol vs Scheme

Despite its name, URL.getProtocol() returns the 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.
/** * Protocols that OkHttp implements for <a * href="http://tools.ietf.org/html/draft-ietf-tls-applayerprotoneg">ALPN</a> selection. * * <h3>Protocol vs Scheme</h3> 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 <i>protocol</i> to identify how HTTP messages * are framed. */
public enum Protocol {
An obsolete plaintext framing that does not use persistent sockets by default.
/** * 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 7230, and tracks revisions to that spec.

/** * A plaintext framing that includes persistent connections. * * <p>This version of OkHttp implements <a href="https://tools.ietf.org/html/rfc7230">RFC * 7230</a>, 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.

Current versions of OkHttp do not support this protocol.

Deprecated:OkHttp has dropped support for SPDY. Prefer HTTP_2.
/** * 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. * * <p>Current versions of OkHttp do not support this protocol. * * @deprecated OkHttp has dropped support for SPDY. Prefer {@link #HTTP_2}. */
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 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 INADEQUATE_SECURITY.

/** * 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. * * <p>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"),
Cleartext HTTP/2 with no "upgrade" round trip. This option requires the client to have prior knowledge that the server supports cleartext HTTP/2.
See Also:
/** * Cleartext HTTP/2 with no "upgrade" round trip. This option requires the client to have prior * knowledge that the server supports cleartext HTTP/2. * * @see <a href="https://tools.ietf.org/html/rfc7540#section-3.4">Starting HTTP/2 with Prior * Knowledge</a> */
H2_PRIOR_KNOWLEDGE("h2_prior_knowledge"),
QUIC (Quick UDP Internet Connection) is a new multiplexed and secure transport atop UDP, designed from the ground up and optimized for HTTP/2 semantics. HTTP/1.1 semantics are layered on HTTP/2.

QUIC is not natively supported by OkHttp, but provided to allow a theoretical interceptor that provides support.

/** * QUIC (Quick UDP Internet Connection) is a new multiplexed and secure transport atop UDP, * designed from the ground up and optimized for HTTP/2 semantics. * HTTP/1.1 semantics are layered on HTTP/2. * * <p>QUIC is not natively supported by OkHttp, but provided to allow a theoretical * interceptor that provides support. */
QUIC("quic"); private final String protocol; Protocol(String protocol) { this.protocol = protocol; }
Returns the protocol identified by protocol.
Throws:
/** * 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(H2_PRIOR_KNOWLEDGE.protocol)) return H2_PRIOR_KNOWLEDGE; if (protocol.equals(HTTP_2.protocol)) return HTTP_2; if (protocol.equals(SPDY_3.protocol)) return SPDY_3; if (protocol.equals(QUIC.protocol)) return QUIC; 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".
See Also:
/** * Returns the string used to identify this protocol for ALPN, like "http/1.1", "spdy/3.1" or * "h2". * * @see <a href="https://www.iana.org/assignments/tls-extensiontype-values">IANA * tls-extensiontype-values</a> */
@Override public String toString() { return protocol; } }