Пример #1
0
        public static AppDelegate Middleware(AppDelegate app)
        {
            return
                (env, result, fault) =>
                    app(
                        env,
                        (status, headers, body) =>
                        {
                            if (IsStatusWithNoNoEntityBody(status) ||
                                headers.ContainsKey("Content-Length") ||
                                headers.ContainsKey("Transfer-Encoding"))
                            {
                                result(status, headers, body);
                            }
                            else
                            {
                                var token = CancellationToken.None;
                                object obj;
                                if (env.TryGetValue(typeof(CancellationToken).FullName, out obj) && obj is CancellationToken)
                                    token = (CancellationToken)obj;

                                var buffer = new DataBuffer();
                                body(
                                    buffer.Add,
                                    ex =>
                                    {
                                        buffer.End(ex);
                                        headers["Content-Length"] = new[] { buffer.GetCount().ToString() };
                                        result(status, headers, buffer.Body);
                                    },
                                    token);
                            }
                        },
                        fault);
        }
Пример #2
0
 public static AppDelegate Middleware(AppDelegate app)
 {
     return
         (call, callback) =>
             app(
                 call,
                 (result, error) =>
                 {
                     if (error != null ||
                         IsStatusWithNoNoEntityBody(result.Status) ||
                         result.Headers.ContainsKey("Content-Length") ||
                         result.Headers.ContainsKey("Transfer-Encoding"))
                     {
                         callback(result, error);
                     }
                     else
                     {
                         var buffer = new DataBuffer();
                         result.Body.Invoke(
                             buffer.Add,
                             ex =>
                             {
                                 buffer.End(ex);
                                 result.Headers.SetHeader("Content-Length", buffer.GetCount().ToString());
                                 result.Body = buffer.Body;
                                 callback(result, null);
                             },
                             call.CallDisposed);
                     }
                 });
 }
Пример #3
0
        public static IAppBuilder ContentLength(this IAppBuilder builder)
        {
            return builder.Transform((response, respond, fault) => {
                var status = response.Item1;
                var headers = response.Item2;
                var body = response.Item3;
                if (!ExcludeStatusesStartingWith.Any(i => status.StartsWith(i)) &&
                    !headers.ContainsKey("content-length") &&
                    !headers.ContainsKey("transfer-encoding") &&
                    body != null)
                {
                    var buffer = new DataBuffer();

                    body((data, ack) => {
                        buffer.Add(data);
                        return false;
                    },
                    fault,
                    () => {
                        headers["Content-Length"] = buffer.GetCount().ToString();
                        respond(Tuple.Create<string, IDictionary<string, string>, BodyDelegate>(status, headers, (onNext, onError, onComplete) => {
                            buffer.Each(d => onNext(new ArraySegment<byte>(d), null));
                            onComplete();
                            return null;
                        }));
                    });
                }
                else
                    respond(response);
            });
        }