Sfoglia il codice sorgente

[D/Hunt] Minor optimizations (#4708)

* Minor optimizations

* Improve HttpServer
Xueping 6 anni fa
parent
commit
3219cc6211

+ 1 - 1
frameworks/D/hunt/dub.json

@@ -8,7 +8,7 @@
 	"libs-posix": [ "http_parser" ],
 	"lflags-posix": ["-Lhttp-parser/"],
 	"dependencies": {
-		"hunt": "~>1.2.0-rc.7",
+		"hunt": "~>1.2.0",
 		"hunt-database": "~>1.2.0-rc.1",
 		"std_data_json": "~>0.18.2"
 	},

+ 42 - 41
frameworks/D/hunt/source/DemoProcessor.d

@@ -24,30 +24,59 @@ enum HttpHeader textHeader = HttpHeader("Content-Type", "text/plain; charset=UTF
 enum HttpHeader htmlHeader = HttpHeader("Content-Type", "text/html; charset=UTF-8");
 enum HttpHeader jsonHeader = HttpHeader("Content-Type", "application/json; charset=UTF-8");
 
+
+enum plaintextLength = "/plaintext".length;
+enum jsonLength = "/json".length;
+enum dbLength = "/db".length;
+enum fortunesLength = "/fortunes".length;
+
 class DemoProcessor : HttpProcessor {
+    version (POSTGRESQL) HttpURI uri;
+
     this(TcpStream client) {
+        version (POSTGRESQL) uri = new HttpURI();
         super(client);
     }
 
     override void onComplete(HttpRequest req) {
-        // debug trace(req.uri);
-        HttpURI uri = new HttpURI(req.uri);
+        string path = req.uri;
+        if(path.length == plaintextLength) { // plaintext
+            respondWith("Hello, World!", 200, textHeader);
+        } else if(path.length == jsonLength) { // json
+            JSONValue js = JSONValue(["message" : JSONValue("Hello, World!")]);
+            respondWith(js.toJSON(), 200, jsonHeader);
+        } else {
 
         version (POSTGRESQL) {
-            switch (uri.getPath) {
-            case "/plaintext":
-                respondWith("Hello, World!", 200, textHeader);
-                break;
+            if(path.length == dbLength) {
+                respondSingleQuery();
+            } else if(path.length == fortunesLength) {
+                respondFortunes();
+            } else {
+                handleDbUpdate(path);
+            }
 
-            case "/json":
-                JSONValue js = JSONValue(["message" : JSONValue("Hello, World!")]);
-                respondWith(js.toJSON(), 200, jsonHeader);
-                break;
+        } else {
+            respondWith404();
+        }
+        }    
+    }
 
-            case "/db":
-                respondSingleQuery();
-                break;
 
+    private void respondWith404() {
+        version (POSTGRESQL) {
+            respondWith("The available paths are: /plaintext, /json, /db, /fortunes," ~
+             " /queries?queries=number, /updates?queries=number", 404);
+        } else {
+            respondWith("The available paths are: /plaintext, /json", 404);
+        }
+    }
+
+    version (POSTGRESQL) {
+        private void handleDbUpdate(string url) {
+            uri.parse(url);
+            
+            switch(uri.getPath()) {
             case "/queries":
                 UrlEncoded queriesMap = new UrlEncoded();
                 uri.decodeQueryTo(queriesMap);
@@ -80,9 +109,6 @@ class DemoProcessor : HttpProcessor {
                 respondMultipleQuery(number);
                 break;
 
-            case "/fortunes":
-                respondFortunes();
-                break;
 
             case "/updates":
                 UrlEncoded queriesMap = new UrlEncoded();
@@ -118,34 +144,9 @@ class DemoProcessor : HttpProcessor {
                 respondWith404();
                 break;
             }
-
-        } else {
-            switch (uri.getPath) {
-            case "/plaintext":
-                respondWith("Hello, World!", 200, textHeader);
-                break;
-
-            case "/json":
-                JSONValue js = JSONValue(["message" : JSONValue("Hello, World!")]);
-                respondWith(js.toJSON(), 200, jsonHeader);
-                break;
-
-            default:
-                respondWith404();
-                break;
-            }
         }
-    }
 
-    private void respondWith404() {
-        version (POSTGRESQL) {
-            respondWith("The available paths are: /plaintext, /json, /db, /fortunes, /queries?queries=number, /updates?queries=number", 404);
-        } else {
-            respondWith("The available paths are: /plaintext, /json", 404);
-        }
-    }
 
-    version (POSTGRESQL) {
         private void respondSingleQuery() {
             int id = uniform(1, 10000);
             string query = "SELECT randomNumber FROM world WHERE id = " ~ id.to!string;

+ 1 - 5
frameworks/D/hunt/source/app.d

@@ -39,12 +39,8 @@ void main(string[] args) {
 		options.setMaximumConnection(totalCPUs*2);
 		dbConnection = new Database(options);
 	}
-	
-	HttpServer httpServer = new HttpServer("0.0.0.0", port, totalCPUs);
-	httpServer.onProcessorCreate(delegate HttpProcessor (TcpStream client) {
-		return new DemoProcessor(client);
-	});
 
+	AbstractTcpServer httpServer = new HttpServer!(DemoProcessor)("0.0.0.0", port, totalCPUs);
 	writefln("listening on http://%s", httpServer.bindingAddress.toString());
 	httpServer.start();
 }

+ 4 - 12
frameworks/D/hunt/source/http/Server.d

@@ -20,6 +20,7 @@ shared static this() {
 	DateTimeHelper.startClock();
 }
 
+import hunt.io.channel;
 
 /**
 */
@@ -66,7 +67,6 @@ abstract class AbstractTcpServer {
 		}
 		writefln("worker count: %d", _workersCount);
 		writefln("IO thread: %d", _group.size);
-		
 
 		while (true) {
 			try {
@@ -104,9 +104,7 @@ alias ProcessorCreater = HttpProcessor delegate(TcpStream client);
 
 /**
 */
-class HttpServer : AbstractTcpServer {
-
-	ProcessorCreater processorCreater;
+class HttpServer(T) : AbstractTcpServer if (is(T : HttpProcessor)) {
 
 	this(string ip, ushort port, int thread = (totalCPUs - 1)) {
 		super(new InternetAddress(ip, port), thread);
@@ -117,14 +115,8 @@ class HttpServer : AbstractTcpServer {
 	}
 
 	override protected void onConnectionAccepted(TcpStream client) {
-		if (processorCreater !is null) {
-			HttpProcessor httpProcessor = processorCreater(client);
-			httpProcessor.run();
-		}
+		HttpProcessor httpProcessor = new T(client);
+		httpProcessor.run();
 	}
 
-	HttpServer onProcessorCreate(ProcessorCreater handler) {
-		this.processorCreater = handler;
-		return this;
-	}
 }