1package com.squareup.okhttp.internal.spdy;
2
3// TODO: revisit for http/2 draft 9
4// http://tools.ietf.org/html/draft-ietf-httpbis-http2-09#section-7
5public enum ErrorCode {
6  /** Not an error! For SPDY stream resets, prefer null over NO_ERROR. */
7  NO_ERROR(0, -1, 0),
8
9  PROTOCOL_ERROR(1, 1, 1),
10
11  /** A subtype of PROTOCOL_ERROR used by SPDY. */
12  INVALID_STREAM(1, 2, -1),
13
14  /** A subtype of PROTOCOL_ERROR used by SPDY. */
15  UNSUPPORTED_VERSION(1, 4, -1),
16
17  /** A subtype of PROTOCOL_ERROR used by SPDY. */
18  STREAM_IN_USE(1, 8, -1),
19
20  /** A subtype of PROTOCOL_ERROR used by SPDY. */
21  STREAM_ALREADY_CLOSED(1, 9, -1),
22
23  INTERNAL_ERROR(2, 6, 2),
24
25  FLOW_CONTROL_ERROR(3, 7, -1),
26
27  STREAM_CLOSED(5, -1, -1),
28
29  FRAME_TOO_LARGE(6, 11, -1),
30
31  REFUSED_STREAM(7, 3, -1),
32
33  CANCEL(8, 5, -1),
34
35  COMPRESSION_ERROR(9, -1, -1),
36
37  INVALID_CREDENTIALS(-1, 10, -1);
38
39  public final int httpCode;
40  public final int spdyRstCode;
41  public final int spdyGoAwayCode;
42
43  private ErrorCode(int httpCode, int spdyRstCode, int spdyGoAwayCode) {
44    this.httpCode = httpCode;
45    this.spdyRstCode = spdyRstCode;
46    this.spdyGoAwayCode = spdyGoAwayCode;
47  }
48
49  public static ErrorCode fromSpdy3Rst(int code) {
50    for (ErrorCode errorCode : ErrorCode.values()) {
51      if (errorCode.spdyRstCode == code) return errorCode;
52    }
53    return null;
54  }
55
56  public static ErrorCode fromHttp2(int code) {
57    for (ErrorCode errorCode : ErrorCode.values()) {
58      if (errorCode.httpCode == code) return errorCode;
59    }
60    return null;
61  }
62
63  public static ErrorCode fromSpdyGoAway(int code) {
64    for (ErrorCode errorCode : ErrorCode.values()) {
65      if (errorCode.spdyGoAwayCode == code) return errorCode;
66    }
67    return null;
68  }
69}
70