| 123 | } |
| 124 | |
| 125 | private class Frame implements NioReader.State { |
| 126 | |
| 127 | private ContentType t; |
| 128 | private boolean fin; |
| 129 | private boolean isFragment; |
| 130 | |
| 131 | private NioReader.State init(ContentType t, boolean fin, boolean isFragment) { |
| 132 | if (t != null && !fin && !t.canBeFragmented) { |
| 133 | return closeOnError(t + " cannot be fragmented."); |
| 134 | } |
| 135 | this.t = t; |
| 136 | this.fin = fin; |
| 137 | this.isFragment = isFragment; |
| 138 | return this; |
| 139 | } |
| 140 | |
| 141 | @Override |
| 142 | public NioReader.State processBytes(ByteBuffer bb) { |
| 143 | byte b = bb.get(); |
| 144 | final int size = (byte) (0x7F & b); |
| 145 | final boolean frameMasked = (b & 0x80) != 0; |
| 146 | if (size >= 0 && size <= 125) { |
| 147 | return bodyReadinit(size, t, fin, isFragment, frameMasked); |
| 148 | } |
| 149 | if (t != null && !t.canBeFragmented) { |
| 150 | return closeOnError(t + " Max Size of 125."); |
| 151 | } |
| 152 | if (size == 126) { |
| 153 | return new NioReader.State() { |
| 154 | @Override |
| 155 | public int minRequiredBytes() { |
| 156 | return 2; |
| 157 | } |
| 158 | |
| 159 | @Override |
| 160 | public NioReader.State processBytes(ByteBuffer bb) { |
| 161 | int size = ((bb.get() & 0xFF) << 8) + (bb.get() & 0xFF); |
| 162 | return bodyReadinit(size, t, fin, isFragment, frameMasked); |
| 163 | } |
| 164 | }; |
| 165 | } |
| 166 | if (size == 127) { |
| 167 | return new NioReader.State() { |
| 168 | @Override |
| 169 | public int minRequiredBytes() { |
| 170 | return 8; |
| 171 | } |
| 172 | |
| 173 | @Override |
| 174 | public NioReader.State processBytes(ByteBuffer bb) { |
| 175 | return bodyReadinit((int) bb.getLong(), t, fin, isFragment, frameMasked); |
| 176 | } |
| 177 | }; |
| 178 | } |
| 179 | handler.onError(connection, state, "Unsupported size: " + size); |
| 180 | return createClose(); |
| 181 | } |
| 182 |
nothing calls this directly
no outgoing calls
no test coverage detected
searching dependent graphs…