コード例 #1
0
ファイル: Server.cs プロジェクト: kevinswiber/gate
        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();
            });
        }
コード例 #2
0
ファイル: AppHost.cs プロジェクト: Hyperfair/manos
        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));
        }
コード例 #3
0
ファイル: HttpRequest.cs プロジェクト: kekekeks/manos
        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
            });
        }
コード例 #4
0
ファイル: AppHost.cs プロジェクト: Hyperfair/manos
        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);
        }