summaryrefslogtreecommitdiffhomepage
path: root/src/java/nginx/unit/Request.java
diff options
context:
space:
mode:
authorMax Romanov <max.romanov@nginx.com>2019-09-05 15:27:32 +0300
committerMax Romanov <max.romanov@nginx.com>2019-09-05 15:27:32 +0300
commit2b8cab1e2478547398ad9c2fe68e025c180cac54 (patch)
treed317fcf9ee52f0f8967116f531784ae533b0ae5a /src/java/nginx/unit/Request.java
parent3e23afb0d205e503f6cc7d852e34d07da9a5b7f7 (diff)
downloadunit-2b8cab1e2478547398ad9c2fe68e025c180cac54.tar.gz
unit-2b8cab1e2478547398ad9c2fe68e025c180cac54.tar.bz2
Java: introducing websocket support.
Diffstat (limited to 'src/java/nginx/unit/Request.java')
-rw-r--r--src/java/nginx/unit/Request.java90
1 files changed, 88 insertions, 2 deletions
diff --git a/src/java/nginx/unit/Request.java b/src/java/nginx/unit/Request.java
index 98584efe..335d7980 100644
--- a/src/java/nginx/unit/Request.java
+++ b/src/java/nginx/unit/Request.java
@@ -16,6 +16,7 @@ import java.lang.StringBuffer;
import java.net.URI;
import java.net.URISyntaxException;
+import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
@@ -65,6 +66,9 @@ import org.eclipse.jetty.http.MultiPartFormInputStream;
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.http.MimeTypes;
+import nginx.unit.websocket.WsSession;
+import nginx.unit.websocket.WsIOException;
+
public class Request implements HttpServletRequest, DynamicPathRequest
{
private final Context context;
@@ -114,6 +118,9 @@ public class Request implements HttpServletRequest, DynamicPathRequest
private boolean request_session_id_from_url = false;
private Session session = null;
+ private WsSession wsSession = null;
+ private boolean skip_close_ws = false;
+
private final ServletRequestAttributeListener attr_listener;
public static final String BARE = "nginx.unit.request.bare";
@@ -1203,11 +1210,30 @@ public class Request implements HttpServletRequest, DynamicPathRequest
public <T extends HttpUpgradeHandler> T upgrade(
Class<T> httpUpgradeHandlerClass) throws java.io.IOException, ServletException
{
- log("upgrade: " + httpUpgradeHandlerClass.getName());
+ trace("upgrade: " + httpUpgradeHandlerClass.getName());
- return null;
+ T handler;
+
+ try {
+ handler = httpUpgradeHandlerClass.getConstructor().newInstance();
+ } catch (Exception e) {
+ throw new ServletException(e);
+ }
+
+ upgrade(req_info_ptr);
+
+ return handler;
+ }
+
+ private static native void upgrade(long req_info_ptr);
+
+ public boolean isUpgrade()
+ {
+ return isUpgrade(req_info_ptr);
}
+ private static native boolean isUpgrade(long req_info_ptr);
+
@Override
public String changeSessionId()
{
@@ -1248,5 +1274,65 @@ public class Request implements HttpServletRequest, DynamicPathRequest
public static native void trace(long req_info_ptr, String msg, int msg_len);
private static native Response getResponse(long req_info_ptr);
+
+
+ public void setWsSession(WsSession s)
+ {
+ wsSession = s;
+ }
+
+ private void processWsFrame(ByteBuffer buf, byte opCode, boolean last)
+ throws IOException
+ {
+ trace("processWsFrame: " + opCode + ", [" + buf.position() + ", " + buf.limit() + "]");
+ try {
+ wsSession.processFrame(buf, opCode, last);
+ } catch (WsIOException e) {
+ wsSession.onClose(e.getCloseReason());
+ }
+ }
+
+ private void closeWsSession()
+ {
+ trace("closeWsSession");
+ skip_close_ws = true;
+
+ wsSession.onClose();
+ }
+
+ public void sendWsFrame(ByteBuffer payload, byte opCode, boolean last,
+ long timeoutExpiry) throws IOException
+ {
+ trace("sendWsFrame: " + opCode + ", [" + payload.position() +
+ ", " + payload.limit() + "]");
+
+ if (payload.isDirect()) {
+ sendWsFrame(req_info_ptr, payload, payload.position(),
+ payload.limit() - payload.position(), opCode, last);
+ } else {
+ sendWsFrame(req_info_ptr, payload.array(), payload.position(),
+ payload.limit() - payload.position(), opCode, last);
+ }
+ }
+
+ private static native void sendWsFrame(long req_info_ptr,
+ ByteBuffer buf, int pos, int len, byte opCode, boolean last);
+
+ private static native void sendWsFrame(long req_info_ptr,
+ byte[] arr, int pos, int len, byte opCode, boolean last);
+
+
+ public void closeWs()
+ {
+ if (skip_close_ws) {
+ return;
+ }
+
+ trace("closeWs");
+
+ closeWs(req_info_ptr);
+ }
+
+ private static native void closeWs(long req_info_ptr);
}