Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java88
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);
+ }
+ }
+}

Back to the top