Пример #1
0
        private async Task ProcessResponse(IDictionary <string, object> env, CancellationToken cancel_token)
        {
            var headers       = (Dictionary <string, string[]>)env["owin.ResponseHeaders"];
            var body          = (MemoryStream)env["owin.ResponseBody"];
            var protocol      = GetEnvValue(env, "owin.ResponseProtocol", this.request.Protocol);
            var status_code   = GetEnvValue(env, "owin.ResponseStatusCode", 200);
            var reason_phrase = GetEnvValue(env, "owin.ResponseReasonPhrase", HTTPUtils.GetReasonPhrase(status_code));
            var method        = GetEnvValue(env, "owin.RequestMethod", "GET");

            body.Close();
            var body_ary = body.ToArray();

            if (ResponseHasMessageBody(method, status_code))
            {
                SetHeader(headers, "Content-Length", body_ary.Length.ToString());
            }
            if (status_code == (int)HttpStatusCode.Unauthorized)
            {
                SetHeader(headers, "WWW-Authenticate", "Basic realm=\"PeerCastStation\"");
            }

            var header = new System.Text.StringBuilder($"{protocol} {status_code} {reason_phrase}\r\n");

            foreach (var kv in headers)
            {
                foreach (var v in kv.Value)
                {
                    header.Append($"{kv.Key}: {v}\r\n");
                }
            }
            header.Append("\r\n");
            await Connection.WriteUTF8Async(header.ToString(), cancel_token).ConfigureAwait(false);

            if (body_ary.Length > 0)
            {
                await Connection.WriteAsync(body_ary, cancel_token).ConfigureAwait(false);
            }
        }