public static IDisposable Create(AppDelegate app, int port, string path) { app = ErrorPage.Middleware(app); var effectivePath = path; var endpoint = new IPEndPoint(IPAddress.Any, port); var context = Context.Create(); var httpServer = new HttpServer( context, transaction => { var cts = new CancellationTokenSource(); var requestPathBase = effectivePath; if (requestPathBase == "/" || requestPathBase == null) requestPathBase = ""; var requestPath = transaction.Request.Path; if (requestPath.StartsWith(requestPathBase, StringComparison.OrdinalIgnoreCase)) requestPath = requestPath.Substring(requestPathBase.Length); var requestQueryString = RequestQueryString(transaction.Request.QueryData); var requestHeaders = transaction.Request.Headers.Keys.ToDictionary(k => k, k => transaction.Request.Headers[k], StringComparer.OrdinalIgnoreCase); var env = new Dictionary<string, object> { {OwinConstants.Version, "1.0"}, {OwinConstants.RequestMethod, transaction.Request.Method.ToString().Substring(5)}, {OwinConstants.RequestScheme, "http"}, {OwinConstants.RequestPathBase, requestPathBase}, {OwinConstants.RequestPath, requestPath}, {OwinConstants.RequestQueryString, requestQueryString}, {OwinConstants.RequestHeaders, requestHeaders}, {OwinConstants.RequestBody, RequestBody(transaction.Request.PostBody, transaction.Request.ContentEncoding)}, {"Manos.Http.IHttpTransaction", transaction}, {"server.CLIENT_IP", transaction.Request.Socket.RemoteEndpoint.Address.ToString()}, {"System.Threading.CancellationToken", cts.Token} }; app( env, (status, headers, body) => { transaction.Response.StatusCode = int.Parse(status.Substring(0, 3)); foreach (var header in headers) { if (string.Equals(header.Key, "Set-Cookie", StringComparison.OrdinalIgnoreCase)) { // use a header-injection to avoid re-parsing values into Manos HttpCookie structure transaction.Response.SetHeader(header.Key, string.Join("\r\nSet-Cookie: ", header.Value.ToArray())); } else { transaction.Response.SetHeader(header.Key, string.Join(",", header.Value.ToArray())); } } body( data => { var duplicate = new byte[data.Count]; Array.Copy(data.Array, data.Offset, duplicate, 0, data.Count); transaction.Response.Write(duplicate); return false; }, _ => false, ex => transaction.Response.End(), cts.Token); }, ex => { // This should never be called throw new NotImplementedException(); }); }, context.CreateTcpServerSocket(endpoint.AddressFamily), true); httpServer.Listen(endpoint.Address.ToString(), port); var thread = new Thread(context.Start); thread.Start(); return new Disposable(() => { context.Stop(); thread.Join(250); //httpServer.Dispose(); }); }
public static void SecureListenAt(IPEndPoint endPoint, string cert, string key) { if (endPoint == null) throw new ArgumentNullException ("endPoint"); if (cert == null) throw new ArgumentNullException ("cert"); if (key == null) throw new ArgumentNullException ("key"); if (secureListenEndPoints.ContainsKey (endPoint) || listenEndPoints.Contains (endPoint)) throw new InvalidOperationException ("Endpoint already registered"); secureListenEndPoints.Add (endPoint, Tuple.Create (cert, key)); }
public void Execute() { var remote = new IPEndPoint(IPAddress.Parse (RemoteAddress), RemotePort); Socket = this.Context.CreateTcpSocket (remote.AddressFamily); Socket.Connect (remote, delegate { Stream = new HttpStream (this, Socket.GetSocketStream ()); Stream.Chunked = false; Stream.AddHeaders = false; byte [] body = GetBody (); if (body != null) { Headers.ContentLength = body.Length; Stream.Write (body, 0, body.Length); } Stream.End (() => { HttpResponse response = new HttpResponse (Context, this, Socket); // response.OnCompleted += () => { // if (OnResponse != null) // OnResponse (response); // }; response.Read (() => { if (OnResponse != null) OnResponse (response); }); }); }, ex => { // TODO: figure out what to do here }); }
public static void ListenAt(IPEndPoint endPoint) { if (endPoint == null) throw new ArgumentNullException ("endPoint"); if (listenEndPoints.Contains (endPoint) || secureListenEndPoints.ContainsKey (endPoint)) throw new InvalidOperationException ("Endpoint already registered"); listenEndPoints.Add (endPoint); }