mongoose.cs 2.53 KB
Newer Older
Sergey Lyubka's avatar
Sergey Lyubka committed
1 2 3 4 5 6 7
// This file is part of mongoose web server project,
// https://github.com/cesanta/mongoose

using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)] public struct MongooseHeader {
8 9
  [MarshalAs(UnmanagedType.LPTStr)] public IntPtr name;
  [MarshalAs(UnmanagedType.LPTStr)] public IntPtr value;
Sergey Lyubka's avatar
Sergey Lyubka committed
10 11
};

12 13
// mongoose.h :: struct mg_connection
[StructLayout(LayoutKind.Sequential)] public struct MongooseConnection {
14 15 16 17
  [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;
Sergey Lyubka's avatar
Sergey Lyubka committed
18

19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
	[MarshalAs(UnmanagedType.ByValArray,SizeConst=48)] public char[] remote_ip;
	[MarshalAs(UnmanagedType.LPTStr)] public string local_ip;
	[MarshalAs(UnmanagedType.U2)] public short remote_port;
	[MarshalAs(UnmanagedType.U2)] public short local_port;
	
	[MarshalAs(UnmanagedType.SysInt)] public int num_headers;
  [MarshalAs(UnmanagedType.ByValArray,SizeConst=30)]
    public MongooseHeader[] http_headers;
	
	[MarshalAs(UnmanagedType.LPTStr)] public IntPtr content;
	[MarshalAs(UnmanagedType.SysInt)] public int content_len;
	
	[MarshalAs(UnmanagedType.SysInt)] public int is_websocket;
	[MarshalAs(UnmanagedType.SysInt)] public int status_code;
	[MarshalAs(UnmanagedType.SysInt)] public int wsbits;
Sergey Lyubka's avatar
Sergey Lyubka committed
34 35
};

36
public delegate int MongooseEventHandler(IntPtr c, int ev);
37

Sergey Lyubka's avatar
Sergey Lyubka committed
38
public class Mongoose {
39 40 41 42 43 44 45 46 47 48 49
  public const string dll_ = "mongoose";
  private IntPtr server_;

	[DllImport(dll_)] private static extern IntPtr
		mg_create_server(IntPtr user_data, MongooseEventHandler eh);
	[DllImport(dll_)] private static extern int
		mg_poll_server(IntPtr server, int milli);
  [DllImport(dll_)] private static extern IntPtr
		mg_set_option(IntPtr server, string name, string value);
	[DllImport(dll_)] public static extern int
		mg_send_data(IntPtr conn, string data, int length);	
Sergey Lyubka's avatar
Sergey Lyubka committed
50

51
  public Mongoose(string document_root,
52
                  string listening_port,
53
                  MongooseEventHandler event_handler) {
54 55 56
    server_ = mg_create_server(IntPtr.Zero, event_handler);
		mg_set_option(server_, "document_root", document_root);
		mg_set_option(server_, "listening_port", listening_port);
Sergey Lyubka's avatar
Sergey Lyubka committed
57
  }
58 59 60
	
  public static int send_data(IntPtr conn, string data) {
    return mg_send_data(conn, data, data.Length);
61
  }
62 63 64
	
	public void poll(int milli) {
    mg_poll_server(server_, milli);
Sergey Lyubka's avatar
Sergey Lyubka committed
65
  }
66 67
	
	// TODO: add destructor and call mg_destroy_server()
Sergey Lyubka's avatar
Sergey Lyubka committed
68
}