1166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamathpackage com.squareup.okhttp.internal.spdy;
2166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath
33c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller// TODO: revisit for http/2 draft 9
43c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller// http://tools.ietf.org/html/draft-ietf-httpbis-http2-09#section-7
5166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamathpublic enum ErrorCode {
6166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  /** Not an error! For SPDY stream resets, prefer null over NO_ERROR. */
7166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  NO_ERROR(0, -1, 0),
8166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath
9166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  PROTOCOL_ERROR(1, 1, 1),
10166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath
11166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  /** A subtype of PROTOCOL_ERROR used by SPDY. */
12166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  INVALID_STREAM(1, 2, -1),
13166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath
14166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  /** A subtype of PROTOCOL_ERROR used by SPDY. */
15166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  UNSUPPORTED_VERSION(1, 4, -1),
16166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath
17166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  /** A subtype of PROTOCOL_ERROR used by SPDY. */
18166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  STREAM_IN_USE(1, 8, -1),
19166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath
20166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  /** A subtype of PROTOCOL_ERROR used by SPDY. */
21166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  STREAM_ALREADY_CLOSED(1, 9, -1),
22166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath
23166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  INTERNAL_ERROR(2, 6, 2),
24166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath
25166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  FLOW_CONTROL_ERROR(3, 7, -1),
26166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath
27166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  STREAM_CLOSED(5, -1, -1),
28166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath
29166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  FRAME_TOO_LARGE(6, 11, -1),
30166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath
31166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  REFUSED_STREAM(7, 3, -1),
32166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath
33166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  CANCEL(8, 5, -1),
34166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath
35166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  COMPRESSION_ERROR(9, -1, -1),
36166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath
37166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  INVALID_CREDENTIALS(-1, 10, -1);
38166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath
39166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  public final int httpCode;
40166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  public final int spdyRstCode;
41166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  public final int spdyGoAwayCode;
42166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath
43166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  private ErrorCode(int httpCode, int spdyRstCode, int spdyGoAwayCode) {
44166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath    this.httpCode = httpCode;
45166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath    this.spdyRstCode = spdyRstCode;
46166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath    this.spdyGoAwayCode = spdyGoAwayCode;
47166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  }
48166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath
49166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  public static ErrorCode fromSpdy3Rst(int code) {
50166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath    for (ErrorCode errorCode : ErrorCode.values()) {
51166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath      if (errorCode.spdyRstCode == code) return errorCode;
52166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath    }
53166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath    return null;
54166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  }
55166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath
56166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  public static ErrorCode fromHttp2(int code) {
57166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath    for (ErrorCode errorCode : ErrorCode.values()) {
58166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath      if (errorCode.httpCode == code) return errorCode;
59166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath    }
60166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath    return null;
61166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  }
62166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath
63166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  public static ErrorCode fromSpdyGoAway(int code) {
64166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath    for (ErrorCode errorCode : ErrorCode.values()) {
65166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath      if (errorCode.spdyGoAwayCode == code) return errorCode;
66166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath    }
67166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath    return null;
68166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath  }
69166772be0e5cfdaea1a64b9f63e4c8dbfe48cba3Narayan Kamath}
70