java-gobject-introspection-examples r7 - in trunk: . src/org/verbum



Author: walters
Date: Mon Sep  8 16:41:33 2008
New Revision: 7
URL: http://svn.gnome.org/viewvc/java-gobject-introspection-examples?rev=7&view=rev

Log:
Add SoupTest


Added:
   trunk/src/org/verbum/SoupTest.java
Modified:
   trunk/.classpath

Modified: trunk/.classpath
==============================================================================
--- trunk/.classpath	(original)
+++ trunk/.classpath	Mon Sep  8 16:41:33 2008
@@ -11,7 +11,6 @@
 	<classpathentry kind="lib" path="/usr/share/java/objectweb-asm/asm-util.jar"/>
 	<classpathentry kind="lib" path="/src/build/gi/share/girepository/GdkPixbuf.jar"/>
 	<classpathentry kind="lib" path="/src/build/gi/share/girepository/Atk.jar"/>
-	<classpathentry kind="lib" path="/src/build/gi/share/girepository/WebKit.jar"/>
 	<classpathentry kind="lib" path="/src/build/gi/share/girepository/Gio.jar"/>
 	<classpathentry kind="lib" path="/src/build/gi/share/girepository/Gdk.jar"/>
 	<classpathentry kind="lib" path="/src/build/gi/share/girepository/HippoCanvas.jar"/>
@@ -27,5 +26,7 @@
 	<classpathentry kind="lib" path="/src/build/gi/share/girepository/GooCanvas.jar"/>
 	<classpathentry kind="lib" path="/src/build/gi/share/girepository/GnomeKeyring.jar"/>
 	<classpathentry kind="lib" path="/src/build/gi/share/girepository/GConf.jar"/>
+	<classpathentry kind="lib" path="/src/build/gi/share/girepository/Soup.jar"/>
+	<classpathentry kind="lib" path="/src/build/gi/share/girepository/WebKit.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>

Added: trunk/src/org/verbum/SoupTest.java
==============================================================================
--- (empty file)
+++ trunk/src/org/verbum/SoupTest.java	Mon Sep  8 16:41:33 2008
@@ -0,0 +1,130 @@
+package org.verbum;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.HashMap;
+
+import org.gnome.gir.dynamic.Soup.ClientContext;
+import org.gnome.gir.dynamic.Soup.MemoryUse;
+import org.gnome.gir.dynamic.Soup.Message;
+import org.gnome.gir.dynamic.Soup.MessageBody;
+import org.gnome.gir.dynamic.Soup.MessageHeaders;
+import org.gnome.gir.dynamic.Soup.Server;
+import org.gnome.gir.dynamic.Soup.ServerCallback;
+import org.gnome.gir.dynamic.Soup.SoupGlobals;
+import org.gnome.gir.gobject.GHashTable;
+import org.gnome.gir.gobject.GObjectGlobals;
+import org.gnome.gir.gobject.MainLoop;
+
+import com.sun.jna.Memory;
+import com.sun.jna.Pointer;
+
+public class SoupTest {
+	
+	private static void
+	doGet(Server server, Message msg, String path) throws IOException
+	{
+		File target = new File(path);
+		if (!target.exists()) {
+			msg.setStatus(404);
+			return;
+		} else if (!target.canRead()) {
+			msg.setStatus(403);
+		}
+
+		if (target.isDirectory()) {
+			int slashIdx = path.lastIndexOf('/');
+
+			if (slashIdx < 0) {
+				String uri = SoupGlobals.uriToString(msg.getUri(), false) + "/";
+				((MessageHeaders)msg.get("response-headers")).append("Location", uri);
+				msg.setStatus(301);
+				return;
+			}
+			String index_path = path + "index.html";
+			doGet(server, msg, index_path);
+			return;
+		}
+
+		BufferedInputStream f;
+		try {
+			f = new BufferedInputStream(new FileInputStream(target));
+		} catch (FileNotFoundException e) {
+			throw new RuntimeException(e);
+		}
+
+		if (msg.get("method").equals("GET")) {
+			byte[] buf = new byte[8192];
+			Memory cBuf = new Memory(8192);
+			int count;
+			MessageBody body = (MessageBody) msg.get("response-body");
+			while (true) {
+				count = f.read(buf);
+				cBuf.write(0, buf, 0, count);
+				if (count > 0)
+					body.append(MemoryUse.COPY, cBuf.getPointer(0), (long)count);
+			}
+		} else /* msg->method == SOUP_METHOD_HEAD */ {
+			String length;
+
+			/* We could just use the same code for both GET and
+			 * HEAD. But we'll optimize and avoid the extra
+			 * malloc.
+			 */
+			length = String.format("%lu", target.length());
+			MessageHeaders headers = (MessageHeaders) msg.get("response-headers");
+			headers.append("Content-Length", length);
+		}
+
+		msg.setStatus(200);
+	}	
+	
+	@SuppressWarnings("serial")
+	public static void main(String...args) {
+		GObjectGlobals.init();
+		
+		final String root = args[0];
+	
+		Server server = new Server(new HashMap<String,Object>() {
+			{
+				put("port", 8005);
+				put("server-header", "simple-httpd ");
+			}
+		});
+		server.addHandler(null, new ServerCallback() {
+			@Override
+			public void callback(Server server, Message msg, String path,
+					GHashTable arg3, ClientContext arg4, Pointer arg5) {
+				System.out.printf("%s %s HTTP/1.%s\n", msg.get("method"), path,
+						msg.getHttpVersion());
+				/*
+	soup_message_headers_iter_init (&iter, msg->request_headers);
+	while (soup_message_headers_iter_next (&iter, &name, &value))
+		printf ("%s: %s\n", name, value);
+	if (msg->request_body->length)
+		printf ("%s\n", msg->request_body->data);				 
+				 */
+				String filePath = root + "/." + path;
+				String method = (String) msg.get("method");
+				if (method.equals("GET")) {
+					try {
+						doGet(server, msg, filePath);
+					} catch (IOException e) {
+						e.printStackTrace();
+					}
+				} else {
+					msg.setStatus(500);
+				}
+				System.out.printf("  -> %d %s%n%n", msg.get("status-code"), msg.get("reason-phrase"));				
+			}
+		}, null, null);
+		System.out.printf("%nStarting Server on port %d%n",
+				server.get("port"));
+		server.runAsync();
+		
+		new MainLoop().run();
+	}
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]