| // |
| // ======================================================================== |
| // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. |
| // ------------------------------------------------------------------------ |
| // All rights reserved. This program and the accompanying materials |
| // are made available under the terms of the Eclipse Public License v1.0 |
| // and Apache License v2.0 which accompanies this distribution. |
| // |
| // The Eclipse Public License is available at |
| // http://www.eclipse.org/legal/epl-v10.html |
| // |
| // The Apache License v2.0 is available at |
| // http://www.opensource.org/licenses/apache2.0.php |
| // |
| // You may elect to redistribute this code under either of these licenses. |
| // ======================================================================== |
| // |
| |
| package org.eclipse.jetty.spdy.api; |
| |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| /** |
| * <p>An enumeration of stream statuses.</p> |
| */ |
| public enum StreamStatus |
| { |
| /** |
| * <p>The stream status indicating a protocol error</p> |
| */ |
| PROTOCOL_ERROR(1, 1), |
| /** |
| * <p>The stream status indicating that the stream is not valid</p> |
| */ |
| INVALID_STREAM(2, 2), |
| /** |
| * <p>The stream status indicating that the stream has been refused</p> |
| */ |
| REFUSED_STREAM(3, 3), |
| /** |
| * <p>The stream status indicating that the implementation does not support the SPDY version of the stream</p> |
| */ |
| UNSUPPORTED_VERSION(4, 4), |
| /** |
| * <p>The stream status indicating that the stream is no longer needed</p> |
| */ |
| CANCEL_STREAM(5, 5), |
| /** |
| * <p>The stream status indicating an implementation error</p> |
| */ |
| INTERNAL_ERROR(6, 6), |
| /** |
| * <p>The stream status indicating a flow control error</p> |
| */ |
| FLOW_CONTROL_ERROR(7, 7), |
| /** |
| * <p>The stream status indicating a stream opened more than once</p> |
| */ |
| STREAM_IN_USE(-1, 8), |
| /** |
| * <p>The stream status indicating data on a stream already closed</p> |
| */ |
| STREAM_ALREADY_CLOSED(-1, 9), |
| /** |
| * <p>The stream status indicating credentials not valid</p> |
| */ |
| INVALID_CREDENTIALS(-1, 10), |
| /** |
| * <p>The stream status indicating that the implementation could not support a frame too large</p> |
| */ |
| FRAME_TOO_LARGE(-1, 11); |
| |
| /** |
| * @param version the SPDY protocol version |
| * @param code the stream status code |
| * @return a {@link StreamStatus} from the given version and code, |
| * or null if no such status exists |
| */ |
| public static StreamStatus from(short version, int code) |
| { |
| switch (version) |
| { |
| case SPDY.V2: |
| return Codes.v2Codes.get(code); |
| case SPDY.V3: |
| return Codes.v3Codes.get(code); |
| default: |
| throw new IllegalStateException(); |
| } |
| } |
| |
| private final int v2Code; |
| private final int v3Code; |
| |
| private StreamStatus(int v2Code, int v3Code) |
| { |
| this.v2Code = v2Code; |
| if (v2Code >= 0) |
| Codes.v2Codes.put(v2Code, this); |
| this.v3Code = v3Code; |
| if (v3Code >= 0) |
| Codes.v3Codes.put(v3Code, this); |
| } |
| |
| /** |
| * @param version the SPDY protocol version |
| * @return the stream status code |
| */ |
| public int getCode(short version) |
| { |
| switch (version) |
| { |
| case SPDY.V2: |
| return v2Code; |
| case SPDY.V3: |
| return v3Code; |
| default: |
| throw new IllegalStateException(); |
| } |
| } |
| |
| private static class Codes |
| { |
| private static final Map<Integer, StreamStatus> v2Codes = new HashMap<>(); |
| private static final Map<Integer, StreamStatus> v3Codes = new HashMap<>(); |
| } |
| } |