diff --git a/examples/c#/example.cs b/examples/c#/example.cs index 07f5048c01d30f5a6e8ce94da6351f909d5e6dd2..e7fc453b4c166cb718befa88b12badce6c3fc2a7 100644 --- a/examples/c#/example.cs +++ b/examples/c#/example.cs @@ -5,23 +5,33 @@ using System; using System.Runtime.InteropServices; public class Program { - static private int RequestHandler(MongooseConnection conn) { - return 0; - /* - conn.write("HTTP/1.1 200 OK\r\n\r\n"); - conn.write("Hello from C#!\n"); - conn.write("Your user-agent is: " + conn.get_header("User-Agent") + "\n"); - */ + static private int EventHandler(MongooseEvent ev) { + if (ev.type != 1) { + return 0; // Mark as unhandled + } + + MongooseRequestInfo request_info = (MongooseRequestInfo) + Marshal.PtrToStructure(ev.request_info, typeof(MongooseRequestInfo)); + + if (request_info.uri != "/test") { + return 0; // Mark as unhandled + } + + Mongoose.write(ev.conn, "HTTP/1.1 200 OK\r\n\r\n"); + Mongoose.write(ev.conn, "Hello from C#!\n"); + + return 1; // Mark as handled } static void Main() { - Mongoose web_server = new Mongoose("c:\\", "8080", - new MongooseBeginRequest(RequestHandler)); + Mongoose web_server = new Mongoose(".", "9000", + new MongooseEventHandler(EventHandler)); Console.WriteLine("Mongoose v." + web_server.version_ + " started."); Console.WriteLine("Press enter to exit program."); // Serve requests until user presses "enter" on a keyboard Console.ReadLine(); + web_server.stop(); } } diff --git a/examples/c#/mongoose.cs b/examples/c#/mongoose.cs index 68afed1f84d7f4ec4ed4fe6f143339d9f5a01e27..61ad282b3dafb6d227e185411a6b2a133876f9d8 100644 --- a/examples/c#/mongoose.cs +++ b/examples/c#/mongoose.cs @@ -5,60 +5,60 @@ using System; using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential)] public struct MongooseHeader { - public IntPtr name; // Using IntPtr here because if we use strings here, - public IntPtr value; // it won't be properly marshalled. + [MarshalAs(UnmanagedType.LPTStr)] public IntPtr name; + [MarshalAs(UnmanagedType.LPTStr)] public IntPtr value; }; // mongoose.h :: struct mg_request_info [StructLayout(LayoutKind.Sequential)] public struct MongooseRequestInfo { - public string request_method; - public string uri; - public string http_version; - public string query_string; - public string remote_user; + [MarshalAs(UnmanagedType.LPTStr)] public string request_method; + [MarshalAs(UnmanagedType.LPTStr)] public string uri; + [MarshalAs(UnmanagedType.LPTStr)] public string http_version; + [MarshalAs(UnmanagedType.LPTStr)] public string query_string; + [MarshalAs(UnmanagedType.LPTStr)] public string remote_user; public int remote_ip; public int remote_port; public int is_ssl; - public IntPtr user_data; - public IntPtr conn_data; [MarshalAs(UnmanagedType.ByValArray,SizeConst=64)] public MongooseHeader[] http_headers; }; -[UnmanagedFunctionPointer(CallingConvention.StdCall)] public delegate - int MongooseBeginRequest_native(IntPtr conn); -public delegate int MongooseBeginRequest(MongooseConnection conn); - -// mongoose.h :: struct mg_callbacks -[StructLayout(LayoutKind.Sequential)] public struct MongooseCallbacks { - public MongooseBeginRequest_native begin_request; - [MarshalAs(UnmanagedType.ByValArray,SizeConst=20)] - public IntPtr[] other_callbacks; +[StructLayout(LayoutKind.Sequential)] public struct MongooseEvent { + public int type; + public IntPtr user_data; + public IntPtr conn_data; + public IntPtr event_param; + public IntPtr conn; + public IntPtr request_info; }; +public delegate int MongooseEventHandlerN(ref MongooseEvent ev); +public delegate int MongooseEventHandler(MongooseEvent ev); + public class Mongoose { public const string dll_name_ = "mongoose"; public string version_ = "??"; // These are here to store a ref to the callbacks // while they are over in unmanaged code, to prevent garbage collection. - private event MongooseBeginRequest_native delegates; + private event MongooseEventHandlerN delegates; private IntPtr ctx_; [DllImport(dll_name_)] private static extern IntPtr mg_start([MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPTStr)] string[] options, - ref MongooseCallbacks callbacks, + MongooseEventHandlerN callback, IntPtr user_data); - [DllImport(dll_name_)] public static extern - IntPtr mg_get_request_info(IntPtr conn); [DllImport(dll_name_)] private static extern void mg_stop(IntPtr ctx); - [DllImport(dll_name_)] private static extern string mg_version(); + [DllImport(dll_name_)] private static extern IntPtr mg_version(); + [DllImport(dll_name_)] public static extern int mg_write(IntPtr conn, + string data, int length); - public Mongoose(string document_root, string listening_ports, - MongooseBeginRequest request_handler) { - version_ = mg_version(); + public Mongoose(string document_root, + string listening_ports, + MongooseEventHandler event_handler) { + version_ = Marshal.PtrToStringAnsi(mg_version()); string[] options = { "document_root", document_root, @@ -66,53 +66,28 @@ public class Mongoose { null }; - MongooseBeginRequest_native begin_request_cb = delegate(IntPtr conn) { - return request_handler(new MongooseConnection(conn, this)); + MongooseEventHandlerN cb = delegate(ref MongooseEvent ev) { + return event_handler(ev); }; - MongooseCallbacks callbacks = new MongooseCallbacks(); - callbacks.begin_request = begin_request_cb; // Prevent garbage collection - delegates += begin_request_cb; + delegates += cb; - ctx_ = mg_start(options, ref callbacks, IntPtr.Zero); + ctx_ = mg_start(options, cb, IntPtr.Zero); } - ~Mongoose() { + public static int write(IntPtr conn, string data) { + return mg_write(conn, data, data.Length); + } + + public void stop() { if (this.ctx_ != IntPtr.Zero) { mg_stop(this.ctx_); } this.ctx_ = IntPtr.Zero; } -} -public class MongooseConnection { - public Mongoose mongoose; - private IntPtr conn; - - [DllImport(Mongoose.dll_name_)] private static extern - string mg_get_header(IntPtr conn, string name); - [DllImport(Mongoose.dll_name_)] private static extern - string mg_get_var(IntPtr conn, string name); - [DllImport(Mongoose.dll_name_)] public static extern - int mg_write(IntPtr conn, string data, int length); - - public MongooseConnection(IntPtr conn_, Mongoose mongoose_) { - mongoose = mongoose_; - conn = conn_; - } - - public string get_header(string header_name) { - return mg_get_header(this.conn, header_name); - } - - public string get_var(string header_name) { - string s = mg_get_var(this.conn, header_name); - string copy = "" + s; - return copy; - } - - public int write(string data) { - return mg_write(this.conn, data, data.Length); + ~Mongoose() { + stop(); } }