예제 #1
0
        /// <summary>
        /// Closes this request.
        /// </summary>
        public void Close()
        {
            if (IsOpen)
            {
                WriteResponse(new byte[0]);
                var record = Record.CreateEndRequest(RequestId);
                record.Send(ResponseStream);
                ResponseStream.Flush();
                if (!KeepAlive)
                {
                    // If the response stream is a regular FCGIStream and KeepAlive is false, disconnect it
                    var fcgiStream = ResponseStream as FCGIStream;
                    if (fcgiStream != null)
                    {
                        fcgiStream.Disconnect();
                    }

                    if (ManagingApp != null)
                    {
                        ManagingApp.ConnectionClosed(ResponseStream as FCGIStream);
                    }
                }

                if (ManagingApp != null)
                {
                    ManagingApp.RequestClosed(this);
                }
            }
            IsOpen = false;
        }
예제 #2
0
        /// <summary>Flush</summary>
        public override void Flush()
        {
            byte[] bb = TempBuffer.GetBuffer();

            if (bb != null && bb.Length > 0)
            {
                // 書き換え処理
                Encoding enc     = Response.ContentEncoding;
                string   content = enc.GetString(bb);

                // JSON形式なので、JsonConvertでaccess_tokenを抜き出す。
                Dictionary <string, object> accessTokenResponse = JsonConvert.DeserializeObject <Dictionary <string, object> >(content);

                // access_tokenを
                if (accessTokenResponse.ContainsKey("access_token"))
                {
                    string access_token = (string)accessTokenResponse["access_token"];
                    string id_token     = OidcTokenEditor.ChangeToIdTokenFromAccessToken(access_token, "", HashClaimType.None);
                    if (!string.IsNullOrEmpty(id_token))
                    {
                        // responseにid_tokenとして、このJWTを追加する。
                        accessTokenResponse.Add("id_token", id_token);
                        bb = enc.GetBytes(JsonConvert.SerializeObject(accessTokenResponse));
                    }
                }
            }

            ResponseStream.Write(bb, 0, bb.Length);
            ResponseStream.Flush();
        }
예제 #3
0
        /// <summary>Flush</summary>
        public override void Flush()
        {
            byte[] bb = TempBuffer.GetBuffer();

            if (bb != null && bb.Length > 0)
            {
                // 書き換え処理
                Encoding enc     = Response.ContentEncoding;
                string   content = enc.GetString(bb);

                // JSON形式なので、JsonConvertでaccess_tokenを抜き出す。
                Dictionary <string, object> accessTokenResponse =
                    JsonConvert.DeserializeObject <Dictionary <string, object> >(content);

                // access_tokenを
                if (accessTokenResponse.ContainsKey(OAuth2AndOIDCConst.AccessToken))
                {
                    string access_token = (string)accessTokenResponse[OAuth2AndOIDCConst.AccessToken];

                    string id_token = IdToken.ChangeToIdTokenFromAccessToken(
                        access_token, "", "", HashClaimType.None,
                        ASPNETIdentityConfig.OAuth2JWT_pfx, ASPNETIdentityConfig.OAuth2JWTPassword);

                    if (!string.IsNullOrEmpty(id_token))
                    {
                        // responseにid_tokenとして、このJWTを追加する。
                        accessTokenResponse.Add(OAuth2AndOIDCConst.IDToken, id_token);
                        bb = enc.GetBytes(JsonConvert.SerializeObject(accessTokenResponse));
                    }
                }
            }

            ResponseStream.Write(bb, 0, bb.Length);
            ResponseStream.Flush();
        }
예제 #4
0
        public void Given_a_stream_when_I_am_not_text_I_do_not_expect_to_attempt_translation()
        {
            var stream = new MemoryStream();

            var lang          = new Mock <ILanguage>();
            var languagePacks = new Mock <ILanguagePackService>();

            languagePacks.Setup(s => s.GetLanguagePack(It.IsAny <string>()))
            .Returns(new Dictionary <string, string>()
            {
                { "TestArea.Some other stuff", "translated" }
            });

            var translator = new Translator(lang.Object, languagePacks.Object);
            var response   = new Mock <IResponse>();

            response.Setup(r => r.Encoding).Returns(Encoding.UTF8);
            response.Setup(r => r.IsText).Returns(false);

            var responseStream = new ResponseStream(stream, response.Object, translator);
            var testBytes      = Encoding.UTF8.GetBytes("Some stuff %%Civica.Lang:TestArea.Some other stuff%% yet some more stuff");

            responseStream.Write(testBytes, 0, testBytes.Length);
            responseStream.Flush();

            stream.Position = 0;
            Assert.AreEqual(stream.Length, 72);

            var output = new Byte[72];

            stream.Read(output, 0, 72);

            Assert.AreEqual(Encoding.UTF8.GetString(output), "Some stuff %%Civica.Lang:TestArea.Some other stuff%% yet some more stuff");
        }
예제 #5
0
        public void Given_a_stream_when_I_write_to_it_using_a_count_I_expect_the_get_same_results_written_in_my_underlying_stream()
        {
            var stream        = new MemoryStream();
            var lang          = new Mock <ILanguage>();
            var languagePacks = new Mock <ILanguagePackService>();
            var translator    = new Translator(lang.Object, languagePacks.Object);
            var response      = new Mock <IResponse>();

            response.Setup(r => r.Encoding).Returns(Encoding.UTF8);
            response.Setup(r => r.IsText).Returns(true);


            var responseStream = new ResponseStream(stream, response.Object, translator);
            var testBytes      = Encoding.UTF8.GetBytes("A test");

            responseStream.Write(testBytes, 0, testBytes.Length - 2);
            responseStream.Flush();

            stream.Position = 0;
            Assert.AreEqual(stream.Length, 4);

            var output = new Byte[4];

            stream.Read(output, 0, 4);


            Assert.AreEqual(Encoding.UTF8.GetString(output), "A te");
        }
예제 #6
0
        public void Given_a_stream_when_my_tag_bit_of_the_key_is_split_over_two_writes_I_expect_it_to_be_replaced()
        {
            var stream        = new MemoryStream();
            var lang          = new Mock <ILanguage>();
            var languagePacks = new Mock <ILanguagePackService>();
            var translator    = new Translator(lang.Object, languagePacks.Object);
            var response      = new Mock <IResponse>();

            response.Setup(r => r.Encoding).Returns(Encoding.UTF8);
            response.Setup(r => r.IsText).Returns(true);

            var responseStream = new ResponseStream(stream, response.Object, translator);
            var testBytes      = Encoding.UTF8.GetBytes("Some stuff %");

            responseStream.Write(testBytes, 0, testBytes.Length);

            testBytes = Encoding.UTF8.GetBytes("%Civica.Lang:TestArea.Some other stuff%% yet some more stuff");
            responseStream.Write(testBytes, 0, testBytes.Length);

            responseStream.Flush();

            stream.Position = 0;
            Assert.AreEqual(stream.Length, 47);

            var output = new Byte[47];

            stream.Read(output, 0, 47);


            Assert.AreEqual(Encoding.UTF8.GetString(output), "Some stuff Some other stuff yet some more stuff");
        }
예제 #7
0
        public void Given_a_stream_when_I_have_an_unclosed_tag_I_do_not_expect_it_to_be_replaced()
        {
            var stream        = new MemoryStream();
            var lang          = new Mock <ILanguage>();
            var languagePacks = new Mock <ILanguagePackService>();
            var translator    = new Translator(lang.Object, languagePacks.Object);
            var response      = new Mock <IResponse>();

            response.Setup(r => r.Encoding).Returns(Encoding.UTF8);
            response.Setup(r => r.IsText).Returns(true);

            var responseStream = new ResponseStream(stream, response.Object, translator);
            var testBytes      = Encoding.UTF8.GetBytes("Some stuff %%Civica.Lang:TestArea.Some other stuff");

            responseStream.Write(testBytes, 0, testBytes.Length);
            responseStream.Flush();

            stream.Position = 0;
            Assert.AreEqual(stream.Length, 50);

            var output = new Byte[50];

            stream.Read(output, 0, 50);


            Assert.AreEqual(Encoding.UTF8.GetString(output), "Some stuff %%Civica.Lang:TestArea.Some other stuff");
        }
예제 #8
0
        public void Given_a_stream_when_I_have_two_language_replacements_I_expect_them_to_be_default_replaced()
        {
            var stream        = new MemoryStream();
            var lang          = new Mock <ILanguage>();
            var languagePacks = new Mock <ILanguagePackService>();
            var translator    = new Translator(lang.Object, languagePacks.Object);
            var response      = new Mock <IResponse>();

            response.Setup(r => r.Encoding).Returns(Encoding.UTF8);
            response.Setup(r => r.IsText).Returns(true);

            var responseStream = new ResponseStream(stream, response.Object, translator);
            var testBytes      = Encoding.UTF8.GetBytes("Some stuff %%Civica.Lang:TestArea.Some other stuff%% yet some more stuff %%Civica.Lang:TestArea.SubArea.A bit more%%");

            responseStream.Write(testBytes, 0, testBytes.Length);
            responseStream.Flush();

            stream.Position = 0;
            Assert.AreEqual(stream.Length, 58);

            var output = new Byte[58];

            stream.Read(output, 0, 58);


            Assert.AreEqual(Encoding.UTF8.GetString(output), "Some stuff Some other stuff yet some more stuff A bit more");
        }
예제 #9
0
        private async Task WriteHeadAsync()
        {
            string head = string.Format("HTTP/1.1 {0} {1}\r\n{2}\r\n",
                                        StatusCode, HttpStatusCodes.StatusCodes[StatusCode], Header.ToString());

            var headBytes = Encoding.UTF8.GetBytes(head);
            await ResponseStream.WriteAsync(Encoding.UTF8.GetBytes(head), 0, headBytes.Length);

            ResponseStream.Flush();
            isHeaderWritten = true;
        }
예제 #10
0
        /// <summary>Flush</summary>
        public override void Flush()
        {
            byte[] bb = TempBuffer.GetBuffer();

            if (bb != null && bb.Length > 0)
            {
                // 書き換え処理
                Encoding enc     = Response.ContentEncoding;
                string   content = enc.GetString(bb);

                // JSON形式なので、JsonConvertでaccess_tokenを抜き出す。
                Dictionary <string, object> accessTokenResponse = JsonConvert.DeserializeObject <Dictionary <string, object> >(content);

                // refresh_tokenを削除
                if (accessTokenResponse.ContainsKey(OAuth2AndOIDCConst.RefreshToken))
                {
                    accessTokenResponse.Remove(OAuth2AndOIDCConst.RefreshToken);
                    bb = enc.GetBytes(JsonConvert.SerializeObject(accessTokenResponse));
                }
            }

            ResponseStream.Write(bb, 0, bb.Length);
            ResponseStream.Flush();
        }
예제 #11
0
 public override void Flush()
 {
     ResponseStream.Flush();
 }