diff options
Diffstat (limited to 'jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/PrefaceParser.java')
-rw-r--r-- | jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/PrefaceParser.java | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/PrefaceParser.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/PrefaceParser.java new file mode 100644 index 0000000000..94c678b640 --- /dev/null +++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/PrefaceParser.java @@ -0,0 +1,88 @@ +// +// ======================================================================== +// Copyright (c) 1995-2016 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.http2.parser; + +import java.nio.ByteBuffer; + +import org.eclipse.jetty.http2.ErrorCode; +import org.eclipse.jetty.http2.frames.PrefaceFrame; +import org.eclipse.jetty.util.BufferUtil; +import org.eclipse.jetty.util.log.Log; +import org.eclipse.jetty.util.log.Logger; + +public class PrefaceParser +{ + private static final Logger LOG = Log.getLogger(PrefaceParser.class); + + private final Parser.Listener listener; + private int cursor; + + public PrefaceParser(Parser.Listener listener) + { + this.listener = listener; + } + + /** + * <p>Advances this parser after the {@link PrefaceFrame#PREFACE_PREAMBLE_BYTES}.</p> + * <p>This allows the HTTP/1.1 parser to parse the preamble of the preface, + * which is a legal HTTP/1.1 request, and this parser will parse the remaining + * bytes, that are not parseable by a HTTP/1.1 parser.</p> + */ + protected void directUpgrade() + { + if (cursor != 0) + throw new IllegalStateException(); + cursor = PrefaceFrame.PREFACE_PREAMBLE_BYTES.length; + } + + public boolean parse(ByteBuffer buffer) + { + while (buffer.hasRemaining()) + { + int currByte = buffer.get(); + if (currByte != PrefaceFrame.PREFACE_BYTES[cursor]) + { + BufferUtil.clear(buffer); + notifyConnectionFailure(ErrorCode.PROTOCOL_ERROR.code, "invalid_preface"); + return false; + } + ++cursor; + if (cursor == PrefaceFrame.PREFACE_BYTES.length) + { + cursor = 0; + if (LOG.isDebugEnabled()) + LOG.debug("Parsed preface bytes from {}", buffer); + return true; + } + } + return false; + } + + protected void notifyConnectionFailure(int error, String reason) + { + try + { + listener.onConnectionFailure(error, reason); + } + catch (Throwable x) + { + LOG.info("Failure while notifying listener " + listener, x); + } + } +} |