public void HandleResponseTest() { using (var reader = new HttpResponseReader(true, int.MaxValue)) { var counter = 0; var tcs = new TaskCompletionSource <HttpResponse>(); reader.ReceivedResponseBody += r => { counter++; if (1 < counter) { tcs.TrySetResult(r); } }; reader.HandleReceive( @"HTTP/1.1 100 Continue Date: Mon, 01 Jan 2018 01:00:00 GMT "); reader.HandleReceive( @"HTTP/1.1 200 OK Date: Mon, 01 Jan 2018 01:00:00 GMT "); var response = tcs.GetResult(); response.StatusLine.StatusCode.Is(System.Net.HttpStatusCode.OK); } }
public void FragmentationWithCompressTest() { var reader = WebSocketReader.Create(true, ProxyConfig.MaxByteArrayLength); var tcs1 = new TaskCompletionSource <WebSocketMessage>(); reader.MessageReceived += message => tcs1.TrySetResult(message); var source = "hogefugapiyo"; byte[] payloadData1; using (var stream = new MemoryStream()) { using (var deflate = new DeflateStream(stream, CompressionMode.Compress, true)) { var sourceBytes = Encoding.UTF8.GetBytes(source); deflate.Write(sourceBytes, 0, sourceBytes.Length); } payloadData1 = stream.ToArray(); } var frameData1 = new List <byte> { 0b01000010, 0b00000100 }; frameData1.AddRange(payloadData1.Take(4)); reader.HandleReceive(frameData1.ToArray(), frameData1.Count); var frameData2 = new List <byte> { 0b10000000, 0b00001010 }; frameData2.AddRange(payloadData1.Skip(4).ToArray()); reader.HandleReceive(frameData2.ToArray(), frameData2.Count); var message1 = tcs1.GetResult(); Encoding.UTF8.GetString(message1.PayloadData).Is(source); var message2data = new List <byte> { 0b10000010, 0b00001100 }; message2data.AddRange(Encoding.UTF8.GetBytes(source)); var tcs2 = new TaskCompletionSource <WebSocketMessage>(); reader.MessageReceived += message => tcs2.TrySetResult(message); reader.HandleReceive(message2data.ToArray(), message2data.Count); var message2 = tcs2.GetResult(); Encoding.UTF8.GetString(message2.PayloadData).Is(source); }
public void TunnelTest() { var clientTcp = new TestTcpClient(); var connection = new ProxyConnection(clientTcp) { CreateTcpClientForServer = (host, port) => new TestTcpClient(host, port) }; var exceptions = new List <Exception>(); connection.FatalException += (_, e) => exceptions.Add(e); connection.StartReceiving(); var tcsSession = new TaskCompletionSource <IReadOnlySession>(); connection.HttpResponseSent += result => tcsSession.TrySetResult(result); var request = @"CONNECT www.example.com:443 HTTP/1.1 Host: www.example.com:443 Proxy-Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36 "; clientTcp.WriteToInput(request); var session = tcsSession.GetResult(); session.Request.ToString().Is(request); var expectedResponse = @"HTTP/1.1 200 Connection Established Date: Mon, 01 Jan 2018 01:00:00 GMT "; session.Response.ToString().Is(expectedResponse); connection.serverConnection.client.AsTest().Host.Is("www.example.com"); connection.serverConnection.client.AsTest().Port.Is(443); connection.serverConnection.IsTunnelMode.IsTrue(); connection.clientConnection.IsTunnelMode.IsTrue(); var expectedString = "hogehoge\r\n"; clientTcp.WriteToInput(expectedString); // HTTP と解釈できないので例外が発生するが、データは送信されている。 var serverTcp = connection.serverConnection.client.AsTest(); serverTcp.GetStream().AsTest().OutputStream.Is(expectedString); exceptions.Count.Is(1); connection.Dispose(); }
public void Session302Test() { var clientTcp = new TestTcpClient(); var connection = new ProxyConnection(clientTcp) { CreateTcpClientForServer = (host, port) => new TestTcpClient(host, port) }; connection.StartReceiving(); var tcsRequest = new TaskCompletionSource <IReadOnlyHttpRequest>(); connection.HttpRequestSent += result => tcsRequest.TrySetResult(result); var tcsSession = new TaskCompletionSource <IReadOnlySession>(); connection.HttpResponseSent += result => tcsSession.TrySetResult(result); var tcsClose = new TaskCompletionSource <ProxyConnection>(); connection.Disposing += result => tcsClose.TrySetResult(result); var request = @"GET http://www.example.com/netgame/social/-/gadgets/=/app_id=854854/ HTTP/1.1 Host: www.example.com Proxy-Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.9 "; clientTcp.WriteToInput(request); var requestResult = tcsRequest.GetResult(); connection.serverConnection.client.AsTest().WriteFileToInput("TestData/Response302"); var sessionResult = tcsSession.GetResult(); sessionResult.Request.ToString().Is(request); var response = sessionResult.Response as HttpResponse; response.GetBodyAsString().Is(""); connection.serverConnection.client.AsTest().Close(); // サーバーから閉じる //clientTcp.Close(); // クライアントから閉じる tcsClose.GetResult().Is(connection); connection.Dispose(); }
public void IsCaptureBodyTest() { var server = new TestTcpServer(); var engine = new DefaultEngine(server) { IsCaptureBody = false }; var clientTcp = new TestTcpClient(); server.AcceptTcp(clientTcp); var connection = engine.connections.Last(); connection.CreateTcpClientForServer = (host, port) => new TestTcpClient(host, port); var tcsRequest = new TaskCompletionSource <IReadOnlyHttpRequest>(); connection.HttpRequestSent += r => tcsRequest.TrySetResult(r); var tcsSession = new TaskCompletionSource <IReadOnlySession>(); connection.HttpResponseSent += s => tcsSession.TrySetResult(s); var request = @"GET / HTTP/1.1 Host: hoge.example.com "; clientTcp.WriteToInput(request); tcsRequest.Task.Wait(5000); connection.serverConnection.client.AsTest().WriteFileToInput("TestData/ResponseChunked"); var session = tcsSession.GetResult(); (session.Request as HttpRequest).Source.Is(request); session.Response.ToString().Is(@"HTTP/1.1 200 OK Server: nginx Date: Thu, 20 Sep 2018 01:59:09 GMT Content-Type: application/javascript; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Cache-Control: private, no-cache, no-cache=""Set-Cookie"", proxy-revalidate Pragma: no-cache Access-Control-Allow-Origin: * P3P: CP=""ADM NOI OUR"" Content-Encoding: gzip "); session.Response.Body.Length.Is(0); (engine as IReadOnlyHttpProxyEngine).Stop(); }
public void RequestBodyTest() { var tcp = new TestTcpClient(); var connection = new ClientConnection(tcp); connection.StartReceiving(); var tcsHeader = new TaskCompletionSource <HttpRequest>(); connection.ReceivedRequestHeaders += result => tcsHeader.TrySetResult(result); var tcsBody = new TaskCompletionSource <HttpRequest>(); connection.ReceivedRequestBody += result => tcsBody.TrySetResult(result); tcp.WriteToInput( @"POST http://203.104.209.71/kcsapi/api_get_member/sortie_conditions HTTP/1.1 Host: 203.104.209.71 Connection: keep-alive Content-Length: 62 Accept: application/json, text/plain, */* Origin: http://203.104.209.71 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36 Content-Type: application/x-www-form-urlencoded Referer: http://203.104.209.71/kcs2/index.php?api_root=/kcsapi&voice_root=/kcs/sound&osapi_root=osapi.example.com&version=4.1.1.4 Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.9 api_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&api_verno=1"); var header = tcsHeader.GetResult(); var body = tcsBody.GetResult(); header.RequestLine.HttpVersion.Is(new Version(1, 1)); header.RequestLine.Method.Is(HttpMethod.Post); header.RequestLine.RequestTarget.Is("http://203.104.209.71/kcsapi/api_get_member/sortie_conditions"); header.Headers.Host.Is("203.104.209.71"); header.Headers.GetFirstValue("Connection").IsNull(); header.Headers.GetOrigin().GetFirstValue("Connection").Is("keep-alive"); header.Headers.ContentLength.Exists.IsTrue(); header.Headers.ContentLength.Is(62); header.Headers.GetFirstValue("Accept").Is("application/json, text/plain, */*"); header.Headers.GetFirstValue("User-Agent").Is("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36"); header.Headers.ContentLength.Exists.IsTrue(); header.Headers.ContentType.Is("application/x-www-form-urlencoded"); header.Headers.GetFirstValue("Referer").Is("http://203.104.209.71/kcs2/index.php?api_root=/kcsapi&voice_root=/kcs/sound&osapi_root=osapi.example.com&version=4.1.1.4"); header.Headers.GetFirstValue("Accept-Encoding").Is("gzip, deflate"); header.Headers.GetFirstValue("Accept-Language").Is("en-US,en;q=0.9"); body.GetBodyAsString().Is("api_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&api_verno=1"); connection.Dispose(); }
public void SessionNoBodyTest() { var clientTcp = new TestTcpClient(); var connection = new ProxyConnection(clientTcp) { CreateTcpClientForServer = (host, port) => new TestTcpClient(host, port) }; connection.StartReceiving(); var tcsRequest = new TaskCompletionSource <IReadOnlyHttpRequest>(); connection.HttpRequestSent += result => tcsRequest.TrySetResult(result); var tcsSession = new TaskCompletionSource <IReadOnlySession>(); connection.HttpResponseSent += result => tcsSession.TrySetResult(result); var tcsClose = new TaskCompletionSource <ProxyConnection>(); connection.Disposing += result => tcsClose.TrySetResult(result); var request = @"GET http://203.104.209.71/kcs2/resources/voice/titlecall_1/005.mp3 HTTP/1.1 Host: 203.104.209.71 "; clientTcp.WriteToInput(request); var requestResult = tcsRequest.GetResult(); connection.serverConnection.client.AsTest().WriteFileToInput("TestData/ResponseNoBody"); var sessionResult = tcsSession.GetResult(); sessionResult.Request.ToString().Is(request); var response = sessionResult.Response as HttpResponse; response.GetBodyAsString().Is(""); connection.serverConnection.client.AsTest().Close(); // サーバーから閉じる //clientTcp.Close(); // クライアントから閉じる tcsClose.GetResult().Is(connection); connection.Dispose(); }
public void RequestTest() { var tcp = new TestTcpClient(); var connection = new ClientConnection(tcp); connection.StartReceiving(); var tcsHeader = new TaskCompletionSource <HttpRequest>(); connection.ReceivedRequestHeaders += result => tcsHeader.TrySetResult(result); var tcsBody = new TaskCompletionSource <HttpRequest>(); connection.ReceivedRequestBody += result => tcsBody.TrySetResult(result); tcp.WriteToInput( @"GET http://203.104.209.71/kcs2/resources/voice/titlecall_1/005.mp3 HTTP/1.1 Host: 203.104.209.71 Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36 Accept: */* Referer: http://203.104.209.71/kcs2/index.php?api_root=/kcsapi&voice_root=/kcs/sound&osapi_root=osapi.example.com&version=4.1.1.4 Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.9 "); var header = tcsHeader.GetResult(); var body = tcsBody.GetResult(); header.RequestLine.HttpVersion.Is(new Version(1, 1)); header.RequestLine.Method.Is(HttpMethod.Get); header.RequestLine.RequestTarget.Is("http://203.104.209.71/kcs2/resources/voice/titlecall_1/005.mp3"); header.Headers.Host.Is("203.104.209.71"); header.Headers.GetFirstValue("Connection").IsNull(); header.Headers.GetOrigin().GetFirstValue("Connection").Is("keep-alive"); header.Headers.GetFirstValue("User-Agent").Is("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36"); header.Headers.GetFirstValue("Accept").Is("*/*"); header.Headers.GetFirstValue("Referer").Is("http://203.104.209.71/kcs2/index.php?api_root=/kcsapi&voice_root=/kcs/sound&osapi_root=osapi.example.com&version=4.1.1.4"); header.Headers.GetFirstValue("Accept-Encoding").Is("gzip, deflate"); header.Headers.GetFirstValue("Accept-Language").Is("en-US,en;q=0.9"); body.Body.IsNull(); connection.Dispose(); }
public void HandlerExceptionTest() { var server = new TestTcpServer(); var engine = new DefaultEngine(server); var clientTcp = new TestTcpClient(); server.AcceptTcp(clientTcp); var connection = engine.connections.Last(); connection.CreateTcpClientForServer = (host, port) => new TestTcpClient(host, port); var tcsRequest = new TaskCompletionSource <IReadOnlyHttpRequest>(); connection.HttpRequestSent += r => tcsRequest.TrySetResult(r); var tcsSession = new TaskCompletionSource <IReadOnlySession>(); (engine as IReadOnlyHttpProxyEngine).HttpResponseSent += (_, s) => tcsSession.TrySetResult(s.Session); (engine as IReadOnlyHttpProxyEngine).HttpResponseSent += (_, s) => throw new Exception(); var request = @"GET / HTTP/1.1 Host: hoge.example.com "; clientTcp.WriteToInput(request); tcsRequest.Task.Wait(5000); connection.serverConnection.client.AsTest().WriteFileToInput("TestData/ResponseChunked"); var session = tcsSession.GetResult(); engine.connections.Count.Is(1); (engine as IReadOnlyHttpProxyEngine).Stop(); }
public void AfterSessionCompleteTest() { var server = new TestTcpServer(); var engine = new DefaultEngine(server); var proxy = HttpProxyFactory.Create(engine); var tcsComplete = new TaskCompletionSource <IReadOnlySession>(); proxy.HttpResponseSent += (_, s) => tcsComplete.TrySetResult(s.Session); var clientTcp = new TestTcpClient(); server.AcceptTcp(clientTcp); var connection = engine.connections.Last(); connection.CreateTcpClientForServer = (host, port) => new TestTcpClient(host, port); var request = @"CONNECT www.example.com:443 HTTP/1.1 Host: www.example.com:443 Proxy-Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36 "; clientTcp.WriteToInput(request); var expectedResponse = @"HTTP/1.1 200 Connection Established Date: Mon, 01 Jan 2018 01:00:00 GMT "; var session = tcsComplete.GetResult(); session.Request.ToString().Is(request); session.Response.ToString().Is(expectedResponse); }
public void StartWithLFFragmentTest() { var heades = Encoding.ASCII.GetBytes(@"HTTP/1.1 200 Content-Type: application/json;charset=UTF-8 Date: Mon, 03 Dec 2018 02:54:48 GMT transfer-encoding: chunked "); using (var reader = new HttpResponseReader(true, 1024 * 1024 * 1024)) { var tcs = new TaskCompletionSource <HttpResponse>(); reader.ReceivedResponseBody += r => tcs.TrySetResult(r); reader.HandleReceive(heades, heades.Length); reader.HandleReceive("2\r\n"); reader.HandleReceive("{}\r"); reader.HandleReceive("\n0\r\n\r\n"); var response = tcs.GetResult(); response.GetBodyAsString().Is("{}"); } }
public void Status1xxTest() { // 1xx レスポンスの場合、最初の空行でメッセージが終了する var response = @"HTTP/1.1 100 Continue "; var connection = new ServerConnection(new TestTcpClient()); connection.StartReceiving(); connection.IsPauseBeforeReceive = false; var tcsBody = new TaskCompletionSource <HttpResponse>(); void handler(HttpResponse r) => tcsBody.TrySetResult(r); connection.ReceivedResponseBody += handler; connection.client.AsTest().WriteToInput(response); var result = tcsBody.GetResult(); connection.ReceivedResponseBody -= handler; connection.Dispose(); }
public void SessionContentLengthTest() { var clientTcp = new TestTcpClient(); var connection = new ProxyConnection(clientTcp) { CreateTcpClientForServer = (host, port) => new TestTcpClient(host, port) }; connection.StartReceiving(); var tcsRequest = new TaskCompletionSource <IReadOnlyHttpRequest>(); connection.HttpRequestSent += result => tcsRequest.TrySetResult(result); var tcsSession = new TaskCompletionSource <IReadOnlySession>(); connection.HttpResponseSent += result => tcsSession.TrySetResult(result); var tcsClose = new TaskCompletionSource <ProxyConnection>(); connection.Disposing += result => tcsClose.TrySetResult(result); var request = @"GET http://203.104.209.71/kcs2/resources/voice/titlecall_1/005.mp3 HTTP/1.1 Host: 203.104.209.71 Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36 Accept: */* Referer: http://203.104.209.71/kcs2/index.php?api_root=/kcsapi&voice_root=/kcs/sound&osapi_root=osapi.example.com&version=4.1.1.4 Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.9 "; clientTcp.WriteToInput(request); //var tcsRequestSuccess = tcsRequest.Task.Wait(1000); //if (!tcsRequestSuccess) // Assert.False(true, "request timeout"); var requestResult = tcsRequest.GetResult(); connection.serverConnection.client.AsTest().WriteFileToInput("TestData/ResponseContentLength"); //var tcsSessionSuccess = tcsSession.Task.Wait(1000); //if (!tcsSessionSuccess) // Assert.False(true, "session timeout"); var sessionResult = tcsSession.GetResult(); var requestHeaders = sessionResult.Request.Headers as HttpHeaders; sessionResult.Request.RequestLine.HttpVersion.Is(new Version(1, 1)); sessionResult.Request.RequestLine.Method.Is(HttpMethod.Get); sessionResult.Request.RequestLine.RequestTarget.Is("http://203.104.209.71/kcs2/resources/voice/titlecall_1/005.mp3"); requestHeaders.Host.Is("203.104.209.71"); requestHeaders.GetFirstValue("Connection").Is("keep-alive"); requestHeaders.GetFirstValue("User-Agent").Is("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36"); requestHeaders.GetFirstValue("Accept").Is("*/*"); requestHeaders.GetFirstValue("Referer").Is("http://203.104.209.71/kcs2/index.php?api_root=/kcsapi&voice_root=/kcs/sound&osapi_root=osapi.example.com&version=4.1.1.4"); requestHeaders.GetFirstValue("Accept-Encoding").Is("gzip, deflate"); requestHeaders.GetFirstValue("Accept-Language").Is("en-US,en;q=0.9"); requestHeaders.HasHeader("Via").IsFalse(); sessionResult.Request.Body.IsNull(); var response = sessionResult.Response as HttpResponse; response.StatusLine.HttpVersion.Is(new Version(1, 1)); response.StatusLine.StatusCode.Is(HttpStatusCode.OK); response.StatusLine.ReasonPhrase.Is("OK"); response.Headers.ContentLength.Exists.Is(true); response.Headers.ContentLength.Is(47); response.Headers.TransferEncoding.Exists.Is(false); response.Headers.IsChunked.Is(false); response.Headers.GetFirstValue("Access-Control-Allow-Credentials").Is("true"); response.Headers.GetFirstValue("Access-Control-Allow-Methods").Is("POST,GET,HEAD,OPTIONS"); response.Headers.GetFirstValue("Access-Control-Allow-Origin").Is("http://d.hatena.ne.jp"); response.Headers.GetFirstValue("Cache-Control").Is("no-store, no-cache"); response.Headers.ContentType.Is("application/json"); response.Headers.GetFirstValue("Date").Is("Thu, 20 Sep 2018 01:59:09 GMT"); response.Headers.GetFirstValue("Expires").Is("Mon, 15 Jun 1998 00:00:00 GMT"); response.Headers.GetFirstValue("Pragma").Is("no-cache"); response.Headers.GetFirstValue("Server").Is("Adtech Adserver"); response.GetBodyAsString().Is(@"{""id"":""31259257328373081"",""seatbid"":[],""nbr"":1}"); //connection.serverConnection.client.AsTest().Close(); // サーバーから閉じる clientTcp.Close(); // クライアントから閉じる tcsClose.GetResult().Is(connection); connection.Dispose(); }
public void TooLongBodyTest() { //var maxCaptureSize = ProxyConfig.MaxByteArrayLength; var maxCaptureSize = 10_000_000; var config = new ProxyConfig { MaxCaptureSize = maxCaptureSize }; var contentLengthResponseHeader = Encoding.ASCII.GetBytes( $@"HTTP/1.1 200 OK Date: Thu, 20 Sep 2018 01:59:09 GMT Content-Length: {maxCaptureSize + 1} "); using (var reader = new HttpResponseReader(config.IsCaptureBody, config.MaxCaptureSize)) { var tcs = new TaskCompletionSource <HttpResponse>(); reader.ReceivedResponseBody += r => tcs.TrySetResult(r); reader.HandleReceive(contentLengthResponseHeader, contentLengthResponseHeader.Length); for (var i = 0m; i < maxCaptureSize + 1;) { Debug.WriteLine(i); var length = 200000000m; if (maxCaptureSize < length + i) { length = maxCaptureSize + 1 - i; } var bytes = Enumerable.Repeat((byte)0, (int)length).ToArray(); reader.HandleReceive(bytes, bytes.Length); i += bytes.Length; } var response = tcs.GetResult(); response.Body.Length.Is(0); } var chunkedBodyResonseHeader = Encoding.ASCII.GetBytes( $@"HTTP/1.1 200 OK Date: Thu, 20 Sep 2018 01:59:09 GMT Transfer-Encoding: chunked "); using (var reader = new HttpResponseReader(config.IsCaptureBody, config.MaxCaptureSize)) { var tcs = new TaskCompletionSource <HttpResponse>(); reader.ReceivedResponseBody += r => tcs.TrySetResult(r); reader.HandleReceive(chunkedBodyResonseHeader, chunkedBodyResonseHeader.Length); var lastChunk = Encoding.ASCII.GetBytes("\r\n0\r\n\r\n"); var maxSize = maxCaptureSize + 1 - Convert.ToString(maxCaptureSize, 16).Length - lastChunk.Length; var maxSizeString = Convert.ToString(maxSize, 16); var chunkSize = Encoding.ASCII.GetBytes(maxSizeString + "\r\n"); reader.HandleReceive(chunkSize, chunkSize.Length); for (var i = 0m; i < maxSize;) { Debug.WriteLine(i); var length = 200000000m; if (maxCaptureSize < length + i) { length = maxSize - i; } var bytes = Enumerable.Repeat((byte)0, (int)length).ToArray(); reader.HandleReceive(bytes, bytes.Length); i += bytes.Length; } reader.HandleReceive(lastChunk, lastChunk.Length); var response = tcs.GetResult(); response.Body.Length.Is(0); } var terminateWithCloseResponseHeader = Encoding.ASCII.GetBytes( $@"HTTP/1.1 200 OK Date: Thu, 20 Sep 2018 01:59:09 GMT Transfer-Encoding: hoge "); using (var reader = new HttpResponseReader(config.IsCaptureBody, config.MaxCaptureSize)) { var tcs = new TaskCompletionSource <HttpResponse>(); reader.ReceivedResponseBody += r => tcs.TrySetResult(r); reader.HandleReceive(terminateWithCloseResponseHeader, terminateWithCloseResponseHeader.Length); for (var i = 0m; i < maxCaptureSize + 1;) { Debug.WriteLine(i); var length = 200000000m; if (maxCaptureSize < length + i) { length = maxCaptureSize + 1 - i; } var bytes = Enumerable.Repeat((byte)0, (int)length).ToArray(); reader.HandleReceive(bytes, bytes.Length); i += bytes.Length; } reader.CloseTcp(); var response = tcs.GetResult(); response.Body.Length.Is(0); } }
public void ChangeUpstreamProxyTest() { var server = new TestTcpServer(); var engine = new DefaultEngine(server); var clientTcp1 = new TestTcpClient(); server.AcceptTcp(clientTcp1); var connection1 = engine.connections.Last(); connection1.CreateTcpClientForServer = (host, port) => new TestTcpClient(host, port); engine.UpstreamProxyConfig = new UpstreamProxyConfig("first.example.com", 1); var tcsRequest1_1 = new TaskCompletionSource <IReadOnlyHttpRequest>(); connection1.HttpRequestSent += r => tcsRequest1_1.TrySetResult(r); var request = @"GET / HTTP/1.1 Host: hoge.example.com "; clientTcp1.WriteToInput(request); var request1_1 = tcsRequest1_1.GetResult(); var serverTcp1 = connection1.serverConnection.client.AsTest(); serverTcp1.Host.Is("first.example.com"); serverTcp1.Port.Is(1); // UpstreamProxyConfig 変更 engine.UpstreamProxyConfig = new UpstreamProxyConfig("second.example.com", 2); var tcsRequest1_2 = new TaskCompletionSource <IReadOnlyHttpRequest>(); connection1.HttpRequestSent += r => tcsRequest1_2.TrySetResult(r); clientTcp1.WriteToInput(request); // 接続中のコネクションには反映されない var request1_2 = tcsRequest1_2.GetResult(); serverTcp1.Host.Is("first.example.com"); serverTcp1.Port.Is(1); // 次の接続から反映される var clientTcp2 = new TestTcpClient(); server.AcceptTcp(clientTcp2); var connection2 = engine.connections.Last(); connection2.CreateTcpClientForServer = (host, port) => new TestTcpClient(host, port); connection2.HttpRequestSent += r => tcsRequest1_1.TrySetResult(r); var tcsRequest2 = new TaskCompletionSource <IReadOnlyHttpRequest>(); connection2.HttpRequestSent += r => tcsRequest2.TrySetResult(r); clientTcp2.WriteToInput(request); var request2 = tcsRequest2.GetResult(); var serverTcp2 = connection2.serverConnection.client.AsTest(); serverTcp2.Host.Is("second.example.com"); serverTcp2.Port.Is(2); (engine as IReadOnlyHttpProxyEngine).Stop(); }
public void CompressWithMaskTest() { var reader = WebSocketReader.Create(true, ProxyConfig.MaxByteArrayLength); var tcs1 = new TaskCompletionSource <WebSocketMessage>(); reader.MessageReceived += message => tcs1.TrySetResult(message); var source = "hogefugapiyo"; byte[] payloadData1; using (var stream = new MemoryStream()) { using (var deflate = new DeflateStream(stream, CompressionMode.Compress, true)) { var sourceBytes = Encoding.UTF8.GetBytes(source); deflate.Write(sourceBytes, 0, sourceBytes.Length); } payloadData1 = stream.ToArray(); } var maskKey = new byte[] { 0b11001100, 0b11001100, 0b11111111, 0b00000000 }; var frameData1 = new List <byte> { 0b11000010, 0b10001110, maskKey[0], maskKey[1], maskKey[2], maskKey[3] }; for (int i = 0; i < payloadData1.Length; i++) { payloadData1[i] ^= maskKey[i % 4]; } frameData1.AddRange(payloadData1); reader.HandleReceive(frameData1.ToArray(), frameData1.Count); var message1 = tcs1.GetResult(); Encoding.UTF8.GetString(message1.PayloadData).Is(source); var message2data = new List <byte> { 0b10000010, 0b10001100, maskKey[0], maskKey[1], maskKey[2], maskKey[3] }; var payloadData2 = Encoding.UTF8.GetBytes(source); for (int i = 0; i < payloadData2.Length; i++) { payloadData2[i] ^= maskKey[i % 4]; } message2data.AddRange(payloadData2); var tcs2 = new TaskCompletionSource <WebSocketMessage>(); reader.MessageReceived += message => tcs2.TrySetResult(message); reader.HandleReceive(message2data.ToArray(), message2data.Count); var message2 = tcs2.GetResult(); Encoding.UTF8.GetString(message2.PayloadData).Is(source); }