You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by mb...@apache.org on 2017/03/24 01:04:55 UTC

asterixdb git commit: Send Bad-request response on failure of decoding query string

Repository: asterixdb
Updated Branches:
  refs/heads/master 902db7851 -> cb2b443ea


Send Bad-request response on failure of decoding query string

Change-Id: I7aa000e469392a5e4b079b331472edd0dc4f65a4
Reviewed-on: https://asterix-gerrit.ics.uci.edu/1602
Sonar-Qube: Jenkins <je...@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
Reviewed-by: Michael Blow <mb...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/cb2b443e
Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/cb2b443e
Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/cb2b443e

Branch: refs/heads/master
Commit: cb2b443ea74e0bf67eb144ad5cdaebf8a1b2add2
Parents: 902db78
Author: Abdullah Alamoudi <ba...@gmail.com>
Authored: Thu Mar 23 16:12:48 2017 -0700
Committer: Michael Blow <mb...@apache.org>
Committed: Thu Mar 23 18:04:38 2017 -0700

----------------------------------------------------------------------
 .../apache/hyracks/http/server/BaseRequest.java |  6 ++-
 .../hyracks/http/server/HttpServerHandler.java  | 32 +++++++++---
 .../hyracks/http/test/HttpServerTest.java       | 52 ++++++++++++++++++--
 3 files changed, 77 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/asterixdb/blob/cb2b443e/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/BaseRequest.java
----------------------------------------------------------------------
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/BaseRequest.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/BaseRequest.java
index d271177..5b354af 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/BaseRequest.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/BaseRequest.java
@@ -22,18 +22,20 @@ import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 
-import io.netty.handler.codec.http.QueryStringDecoder;
 import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.http.server.utils.HttpUtil;
 
 import io.netty.handler.codec.http.FullHttpRequest;
+import io.netty.handler.codec.http.QueryStringDecoder;
 
 public class BaseRequest implements IServletRequest {
     protected final FullHttpRequest request;
     protected final Map<String, List<String>> parameters;
 
     public static IServletRequest create(FullHttpRequest request) throws IOException {
-        return new BaseRequest(request, new QueryStringDecoder(request.uri()).parameters());
+        QueryStringDecoder decoder = new QueryStringDecoder(request.uri());
+        Map<String, List<String>> param = decoder.parameters();
+        return new BaseRequest(request, param);
     }
 
     protected BaseRequest(FullHttpRequest request, Map<String, List<String>> parameters) {

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/cb2b443e/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServerHandler.java
----------------------------------------------------------------------
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServerHandler.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServerHandler.java
index 743800e..6f7ccba 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServerHandler.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServerHandler.java
@@ -24,6 +24,7 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import org.apache.hyracks.http.api.IServlet;
+import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.http.server.utils.HttpUtil;
 
 import io.netty.channel.ChannelFutureListener;
@@ -60,23 +61,38 @@ public class HttpServerHandler extends SimpleChannelInboundHandler<Object> {
 
     @Override
     protected void channelRead0(ChannelHandlerContext ctx, Object msg) {
+        FullHttpRequest request = (FullHttpRequest) msg;
         try {
-            FullHttpRequest request = (FullHttpRequest) msg;
             IServlet servlet = server.getServlet(request);
             if (servlet == null) {
-                DefaultHttpResponse notFound =
-                        new DefaultHttpResponse(request.protocolVersion(), HttpResponseStatus.NOT_FOUND);
-                ctx.write(notFound).addListener(ChannelFutureListener.CLOSE);
+                respond(ctx, request, HttpResponseStatus.NOT_FOUND);
             } else {
-                handler = new HttpRequestHandler(ctx, servlet, HttpUtil.toServletRequest(request), chunkSize);
-                submit();
+                submit(ctx, servlet, request);
             }
         } catch (Exception e) {
-            LOGGER.log(Level.SEVERE, "Failure handling HTTP Request", e);
-            ctx.close();
+            LOGGER.log(Level.SEVERE, "Failure Submitting HTTP Request", e);
+            respond(ctx, request, HttpResponseStatus.INTERNAL_SERVER_ERROR);
         }
     }
 
+    private void respond(ChannelHandlerContext ctx, FullHttpRequest request, HttpResponseStatus status) {
+        DefaultHttpResponse response = new DefaultHttpResponse(request.protocolVersion(), status);
+        ctx.write(response).addListener(ChannelFutureListener.CLOSE);
+    }
+
+    private void submit(ChannelHandlerContext ctx, IServlet servlet, FullHttpRequest request) throws IOException {
+        IServletRequest servletRequest;
+        try {
+            servletRequest = HttpUtil.toServletRequest(request);
+        } catch (IllegalArgumentException e) {
+            LOGGER.log(Level.WARNING, "Failure Decoding Request", e);
+            respond(ctx, request, HttpResponseStatus.BAD_REQUEST);
+            return;
+        }
+        handler = new HttpRequestHandler(ctx, servlet, servletRequest, chunkSize);
+        submit();
+    }
+
     private void submit() throws IOException {
         try {
             server.getExecutor().submit(handler);

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/cb2b443e/hyracks-fullstack/hyracks/hyracks-http/src/test/java/org/apache/hyracks/http/test/HttpServerTest.java
----------------------------------------------------------------------
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/test/java/org/apache/hyracks/http/test/HttpServerTest.java b/hyracks-fullstack/hyracks/hyracks-http/src/test/java/org/apache/hyracks/http/test/HttpServerTest.java
index 20e6fe7..2076201 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/test/java/org/apache/hyracks/http/test/HttpServerTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/test/java/org/apache/hyracks/http/test/HttpServerTest.java
@@ -18,7 +18,13 @@
  */
 package org.apache.hyracks.http.test;
 
+import java.io.BufferedReader;
 import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.lang.reflect.Field;
+import java.net.InetAddress;
+import java.net.Socket;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.nio.charset.StandardCharsets;
@@ -76,11 +82,51 @@ public class HttpServerTest {
         }
     }
 
+    @Test
+    public void testMalformedString() throws Exception {
+        WebManager webMgr = new WebManager();
+        HttpServer server =
+                new HttpServer(webMgr.getBosses(), webMgr.getWorkers(), PORT, NUM_EXECUTOR_THREADS, SERVER_QUEUE_SIZE);
+        SlowServlet servlet = new SlowServlet(server.ctx(), new String[] { PATH });
+        server.addServlet(servlet);
+        webMgr.add(server);
+        webMgr.start();
+        try {
+            StringBuilder response = new StringBuilder();
+            try (Socket s = new Socket(InetAddress.getLocalHost(), PORT)) {
+                PrintWriter pw = new PrintWriter(s.getOutputStream());
+                pw.println("GET /?handle=%7B%22handle%22%3A%5B0%2C%200%5D%7 HTTP/1.1");
+                pw.println("Host: 127.0.0.1");
+                pw.println();
+                pw.flush();
+                BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
+                String line;
+                while ((line = br.readLine()) != null) {
+                    response.append(line).append('\n');
+                }
+                br.close();
+            }
+            String output = response.toString();
+            Assert.assertTrue(output.contains(HttpResponseStatus.BAD_REQUEST.toString()));
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw e;
+        } finally {
+            webMgr.stop();
+        }
+    }
+
+    public static void setPrivateField(Object obj, String filedName, Object value) throws Exception {
+        Field f = obj.getClass().getDeclaredField(filedName);
+        f.setAccessible(true);
+        f.set(obj, value);
+    }
+
     private void request(int count) {
         for (int i = 0; i < count; i++) {
             Thread next = new Thread(() -> {
                 try {
-                    HttpUriRequest request = request();
+                    HttpUriRequest request = request(null);
                     HttpResponse response = executeHttpRequest(request);
                     if (response.getStatusLine().getStatusCode() == HttpResponseStatus.OK.code()) {
                         SUCCESS_COUNT.incrementAndGet();
@@ -111,8 +157,8 @@ public class HttpServerTest {
         }
     }
 
-    protected HttpUriRequest request() throws URISyntaxException {
-        URI uri = new URI(PROTOCOL, null, HOST, PORT, PATH, null, null);
+    protected HttpUriRequest request(String query) throws URISyntaxException {
+        URI uri = new URI(PROTOCOL, null, HOST, PORT, PATH, query, null);
         RequestBuilder builder = RequestBuilder.get(uri);
         builder.setCharset(StandardCharsets.UTF_8);
         return builder.build();