mirror of
https://github.com/cesanta/mongoose.git
synced 2026-10-12 10:13:29 +00:00
c# example synced to the current version, and tested
This commit is contained in:
+19
-9
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
+37
-62
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user