diff --git a/SharpConnect.WebServer.WebSocketTest.sln b/SharpConnect.WebServer.WebSocketTest.sln index 87f053b..7aec467 100644 --- a/SharpConnect.WebServer.WebSocketTest.sln +++ b/SharpConnect.WebServer.WebSocketTest.sln @@ -1,18 +1,12 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26228.9 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31702.278 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NETSTD", "NETSTD", "{7B52AB7D-5670-44FF-A63C-3CEC0E0270F7}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NET20", "NET20", "{A504C555-2D0F-45F6-BE0F-ECE77E52AC54}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test", "Test", "{A4D07531-CF2A-48C3-A5C5-0BC11FAC787D}" -EndProject -Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "WebServerApp", "tests\WebServerApp\WebServerApp.shproj", "{CF4BFB13-5A72-4328-9700-8F27BC1C570A}" -EndProject -Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SharpConnect.WebServer", "src\SharpConnect.WebServer\SharpConnect.WebServer.shproj", "{1585F301-4ECE-462C-A9D5-49BFE1C40041}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpConnect.WebServer", "builds\NETSTD\SharpConnect.WebServer\SharpConnect.WebServer.csproj", "{24CA242A-B8F4-450D-A08F-69B23F54B4C9}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpConnect.WebServer", "builds\NET20\SharpConnect.WebServer\SharpConnect.WebServer.csproj", "{741A7428-705D-4928-B02C-0DB087FDE753}" @@ -27,13 +21,21 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestLoad", "builds\NET20\Te EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestLoadNetStd", "builds\NETSTD\TestLoadNetStd\TestLoadNetStd.csproj", "{3FA078C1-4A8D-4D71-81C7-C8C978D8191C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestWsClient_NETSTD", "TestWsClient_NETSTD\TestWsClient_NETSTD.csproj", "{3D29EE04-0C3A-4564-93FF-299562EF5E1E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestWsClient_NETSTD", "TestWsClient_NETSTD\TestWsClient_NETSTD.csproj", "{3D29EE04-0C3A-4564-93FF-299562EF5E1E}" +EndProject +Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "WebServerApp_SH", "tests\WebServerApp\WebServerApp_SH.shproj", "{CF4BFB13-5A72-4328-9700-8F27BC1C570A}" +EndProject +Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SharpConnect.WebServer_SH", "src\SharpConnect.WebServer\SharpConnect.WebServer_SH.shproj", "{1585F301-4ECE-462C-A9D5-49BFE1C40041}" EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution src\SharpConnect.WebServer\SharpConnect.WebServer.projitems*{1585f301-4ece-462c-a9d5-49bfe1c40041}*SharedItemsImports = 13 + src\SharpConnect.WebServer\SharpConnect.WebServer.projitems*{24ca242a-b8f4-450d-a08f-69b23f54b4c9}*SharedItemsImports = 5 tests\TestLoad\TestLoad.projitems*{24e7e45b-3716-4dd3-b4b0-10dff0a6211a}*SharedItemsImports = 4 + tests\TestLoad\TestLoad.projitems*{3fa078c1-4a8d-4d71-81c7-c8c978d8191c}*SharedItemsImports = 5 src\SharpConnect.WebServer\SharpConnect.WebServer.projitems*{741a7428-705d-4928-b02c-0db087fde753}*SharedItemsImports = 4 + src\SharpConnect.WebServer\SharpConnect.WebServer.projitems*{b8817170-2aca-4535-bc1b-0d79e1eb0fe6}*SharedItemsImports = 5 + tests\WebServerApp\WebServerApp.projitems*{b8817170-2aca-4535-bc1b-0d79e1eb0fe6}*SharedItemsImports = 5 tests\WebServerApp\WebServerApp.projitems*{ce060f7f-6f5f-45fa-855f-81f28ff00d21}*SharedItemsImports = 4 tests\WebServerApp\WebServerApp.projitems*{cf4bfb13-5a72-4328-9700-8f27bc1c570a}*SharedItemsImports = 13 EndGlobalSection @@ -300,7 +302,6 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {CF4BFB13-5A72-4328-9700-8F27BC1C570A} = {A4D07531-CF2A-48C3-A5C5-0BC11FAC787D} {24CA242A-B8F4-450D-A08F-69B23F54B4C9} = {7B52AB7D-5670-44FF-A63C-3CEC0E0270F7} {741A7428-705D-4928-B02C-0DB087FDE753} = {A504C555-2D0F-45F6-BE0F-ECE77E52AC54} {CE060F7F-6F5F-45FA-855F-81F28FF00D21} = {A504C555-2D0F-45F6-BE0F-ECE77E52AC54} diff --git a/SharpConnect.WebServer.sln b/SharpConnect.WebServer.sln index c450ebf..e7d3c38 100644 --- a/SharpConnect.WebServer.sln +++ b/SharpConnect.WebServer.sln @@ -1,16 +1,12 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26228.9 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31702.278 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NETSTD", "NETSTD", "{7B52AB7D-5670-44FF-A63C-3CEC0E0270F7}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NET20", "NET20", "{A504C555-2D0F-45F6-BE0F-ECE77E52AC54}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test", "Test", "{A4D07531-CF2A-48C3-A5C5-0BC11FAC787D}" -EndProject -Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "WebServerApp", "tests\WebServerApp\WebServerApp.shproj", "{CF4BFB13-5A72-4328-9700-8F27BC1C570A}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpConnect.WebServer", "builds\NETSTD\SharpConnect.WebServer\SharpConnect.WebServer.csproj", "{24CA242A-B8F4-450D-A08F-69B23F54B4C9}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpConnect.WebServer", "builds\NET20\SharpConnect.WebServer\SharpConnect.WebServer.csproj", "{741A7428-705D-4928-B02C-0DB087FDE753}" @@ -29,12 +25,18 @@ Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "TestLoad", "tests\TestLoad\ EndProject Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SharpConnect.WebServer_SH", "src\SharpConnect.WebServer\SharpConnect.WebServer_SH.shproj", "{1585F301-4ECE-462C-A9D5-49BFE1C40041}" EndProject +Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "WebServerApp_SH", "tests\WebServerApp\WebServerApp_SH.shproj", "{CF4BFB13-5A72-4328-9700-8F27BC1C570A}" +EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution src\SharpConnect.WebServer\SharpConnect.WebServer.projitems*{1585f301-4ece-462c-a9d5-49bfe1c40041}*SharedItemsImports = 13 + src\SharpConnect.WebServer\SharpConnect.WebServer.projitems*{24ca242a-b8f4-450d-a08f-69b23f54b4c9}*SharedItemsImports = 5 tests\TestLoad\TestLoad.projitems*{24e7e45b-3716-4dd3-b4b0-10dff0a6211a}*SharedItemsImports = 4 + tests\TestLoad\TestLoad.projitems*{3fa078c1-4a8d-4d71-81c7-c8c978d8191c}*SharedItemsImports = 5 src\SharpConnect.WebServer\SharpConnect.WebServer.projitems*{741a7428-705d-4928-b02c-0db087fde753}*SharedItemsImports = 4 tests\TestLoad\TestLoad.projitems*{a793836f-ecfa-4009-b36b-b812baa4c7e1}*SharedItemsImports = 13 + src\SharpConnect.WebServer\SharpConnect.WebServer.projitems*{b8817170-2aca-4535-bc1b-0d79e1eb0fe6}*SharedItemsImports = 5 + tests\WebServerApp\WebServerApp.projitems*{b8817170-2aca-4535-bc1b-0d79e1eb0fe6}*SharedItemsImports = 5 tests\WebServerApp\WebServerApp.projitems*{ce060f7f-6f5f-45fa-855f-81f28ff00d21}*SharedItemsImports = 4 tests\WebServerApp\WebServerApp.projitems*{cf4bfb13-5a72-4328-9700-8f27bc1c570a}*SharedItemsImports = 13 EndGlobalSection @@ -271,7 +273,6 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {CF4BFB13-5A72-4328-9700-8F27BC1C570A} = {A4D07531-CF2A-48C3-A5C5-0BC11FAC787D} {24CA242A-B8F4-450D-A08F-69B23F54B4C9} = {7B52AB7D-5670-44FF-A63C-3CEC0E0270F7} {741A7428-705D-4928-B02C-0DB087FDE753} = {A504C555-2D0F-45F6-BE0F-ECE77E52AC54} {CE060F7F-6F5F-45FA-855F-81F28FF00D21} = {A504C555-2D0F-45F6-BE0F-ECE77E52AC54} diff --git a/builds/NET20/SharpConnect.WebServer/SharpConnect.WebServer.csproj b/builds/NET20/SharpConnect.WebServer/SharpConnect.WebServer.csproj index f885897..b72df6c 100644 --- a/builds/NET20/SharpConnect.WebServer/SharpConnect.WebServer.csproj +++ b/builds/NET20/SharpConnect.WebServer/SharpConnect.WebServer.csproj @@ -22,6 +22,7 @@ prompt 4 true + true pdbonly diff --git a/src/SharpConnect.WebServer/HttpWebServer0/HttpRequest.cs b/src/SharpConnect.WebServer/HttpWebServer0/HttpRequest.cs index 51414d2..d7540a6 100644 --- a/src/SharpConnect.WebServer/HttpWebServer0/HttpRequest.cs +++ b/src/SharpConnect.WebServer/HttpWebServer0/HttpRequest.cs @@ -13,6 +13,15 @@ enum ProcessReceiveBufferResult NeedMore, Complete } + public abstract class DataStream + { + public abstract int CurrentReadPos { get; set; } + public abstract IntPtr GetUnManagedPtr(); + public abstract byte[] GetManagedBuffer(); + public abstract bool IsUnmanaged { get; } + public abstract int GetLength(); + public DataStream Next { get; set; } + } interface IHttpContext : ISendIO { @@ -23,8 +32,10 @@ interface IHttpContext : ISendIO } interface ISendIO { + void EnqueueSendingData(DataStream dataStream); void EnqueueSendingData(byte[] buffer, int len); void SendIOStartSend(); + } public class WebRequestParameter { @@ -292,7 +303,6 @@ internal ProcessReceiveBufferResult LoadData() //check if complete or not _contentByteCount = 0; //reset _uploadCanceled = false;//reset - _readPos = ParseHttpRequestHeader(); if (ContentLength > InMemMaxUploadBodySize) @@ -466,8 +476,6 @@ int ParseHttpRequestHeader() return readpos; } - - int _readPos; FileStream _uploadTempFile = null; bool _uploadCanceled = false; diff --git a/src/SharpConnect.WebServer/HttpWebServer0/HttpResponse.cs b/src/SharpConnect.WebServer/HttpWebServer0/HttpResponse.cs index f7a058c..558ce03 100644 --- a/src/SharpConnect.WebServer/HttpWebServer0/HttpResponse.cs +++ b/src/SharpConnect.WebServer/HttpWebServer0/HttpResponse.cs @@ -22,6 +22,7 @@ public enum WebResponseContentType : byte ApplicationOctetStream, ApplicationJson, + ApplicationWasm, } public enum TextCharSet : byte @@ -104,6 +105,7 @@ internal void WriteHeader(StringBuilder stbuilder) } + public abstract class HttpResponse : IDisposable { enum WriteContentState : byte @@ -180,7 +182,7 @@ public void SetHeader(string key, string value) /// public void Write(string str) { - //write to output stream + //write to output stream byte[] bytes = Encoding.UTF8.GetBytes(str.ToCharArray()); //write to stream _bodyMs.Write(bytes, 0, bytes.Length); @@ -201,15 +203,26 @@ public void Write(byte[] rawBuffer) public void End(string str) { //Write and End + _dataStream = null; Write(str); End(); } public void End(byte[] data) { + _dataStream = null; _bodyMs.Write(data, 0, data.Length); _contentByteCount += data.Length; End(); } + //*** + + DataStream _dataStream; + public void End(DataStream dataStream) + { + _dataStream = dataStream; + _contentByteCount = dataStream.GetLength(); + End(); + } public void ActualEnd() { @@ -278,18 +291,30 @@ public void ActualEnd() _headerStBuilder.Append("\r\n");//end header part _writeContentState = WriteContentState.HttpBody; //----------------------------------------------------------------- - //switch transfer encoding method of the body*** - byte[] headBuffer = Encoding.UTF8.GetBytes(_headerStBuilder.ToString().ToCharArray()); - byte[] dataToSend = new byte[headBuffer.Length + _contentByteCount]; - Buffer.BlockCopy(headBuffer, 0, dataToSend, 0, headBuffer.Length); - var pos = _bodyMs.Position; - _bodyMs.Position = 0; - _bodyMs.Read(dataToSend, headBuffer.Length, _contentByteCount); - //---------------------------------------------------- - //copy data to send buffer - - _sendIO.EnqueueSendingData(dataToSend, dataToSend.Length); - //---------------------------------------------------- + //TODO: switch transfer encoding method of the body*** + if (_dataStream != null) + { + //MyByteDataStream headerBuffer = new MyByteDataStream(); + //byte[] headBuffer = Encoding.UTF8.GetBytes(_headerStBuilder.ToString().ToCharArray()); + //headerBuffer.SetData(headBuffer, headBuffer.Length); + //headerBuffer.Next = _dataStream; + //_sendIO.EnqueueSendingData(headerBuffer); + + } + else + { + byte[] headBuffer = Encoding.UTF8.GetBytes(_headerStBuilder.ToString().ToCharArray()); + byte[] dataToSend = new byte[headBuffer.Length + _contentByteCount]; //TODO: review here, use pool? + Buffer.BlockCopy(headBuffer, 0, dataToSend, 0, headBuffer.Length);//copy header to buffer + + _bodyMs.Position = 0;//reset start writing pos + _bodyMs.Read(dataToSend, headBuffer.Length, _contentByteCount); + //---------------------------------------------------- + //copy data to send buffer + _sendIO.EnqueueSendingData(dataToSend, dataToSend.Length); + //---------------------------------------------------- + } + ResetAll(); } break; @@ -346,7 +371,7 @@ void StartSend() void WriteContentBodyInChunkMode() { //---------------------------------------------------- - var pos = _bodyMs.Position; + _bodyMs.Position = 0; byte[] bodyLengthInHex = Encoding.UTF8.GetBytes(_contentByteCount.ToString("X")); int chuckedPrefixLength = bodyLengthInHex.Length; @@ -404,6 +429,8 @@ static string GetContentType(WebResponseContentType contentType) return "image/jpeg"; case WebResponseContentType.ImagePng: return "image/png"; + case WebResponseContentType.ApplicationWasm: + return "application/wasm"; case WebResponseContentType.ApplicationOctetStream: return "application/octet-stream"; case WebResponseContentType.ApplicationJson: @@ -426,6 +453,7 @@ static string GetContentType(WebResponseContentType contentType) static void HeaderAppendConnectionType(StringBuilder headerStBuilder, bool keepAlive) { //always close connection + //headerStBuilder.Append("Connection: keep-alive\r\n"); //headerStBuilder.Append("Connection: close\r\n"); if (keepAlive) { diff --git a/src/SharpConnect.WebServer/HttpWebServer1/HttpContext.cs b/src/SharpConnect.WebServer/HttpWebServer1/HttpContext.cs index 1069d9a..f915bee 100644 --- a/src/SharpConnect.WebServer/HttpWebServer1/HttpContext.cs +++ b/src/SharpConnect.WebServer/HttpWebServer1/HttpContext.cs @@ -39,7 +39,7 @@ namespace SharpConnect.WebServers /// class HttpContext : IHttpContext, ISendIO { - const int RECV_BUFF_SIZE = 1024; + const int RECV_BUFF_SIZE = 1024 * 16; readonly SocketAsyncEventArgs _send_a; readonly SocketAsyncEventArgs _recv_a; @@ -49,7 +49,7 @@ class HttpContext : IHttpContext, ISendIO HttpRequestImpl _httpReq; HttpResponseImpl _httpResp; ReqRespHandler _reqHandler; - HttpWebServer _ownerServer; + HttpWebServer _ownerServer; public HttpContext( HttpWebServer ownerServer, @@ -149,7 +149,7 @@ void HandleReceive(RecvEventCode recvEventCode) _httpResp.ActualEnd(); } -// Reset(); + // Reset(); } break; case ProcessReceiveBufferResult.NeedMore: @@ -269,8 +269,8 @@ public void Dispose() public void SendIOStartSend() => _sendIO.StartSendAsync(); - public void EnqueueSendingData(byte[] dataToSend, int count) => _sendIO.EnqueueOutputData(dataToSend, count); - + public void EnqueueSendingData(byte[] dataToSend, int count) => _sendIO.EnqueueOutputData(dataToSend, count); + public void EnqueueSendingData(DataStream dataStream) => _sendIO.EnqueueOutputData(dataStream); public int RecvByteTransfer => _recvIO.BytesTransferred; public byte ReadByte(int pos) => _recvIO.ReadByte(pos); diff --git a/src/SharpConnect.WebServer/HttpWebServer1/RecvIO_SendIO.cs b/src/SharpConnect.WebServer/HttpWebServer1/RecvIO_SendIO.cs index 3b2d53a..8f4dd87 100644 --- a/src/SharpConnect.WebServer/HttpWebServer1/RecvIO_SendIO.cs +++ b/src/SharpConnect.WebServer/HttpWebServer1/RecvIO_SendIO.cs @@ -174,6 +174,10 @@ public void Reset() } _sendingQueue.Clear(); } + } + public void EnqueueOutputData(SharpConnect.WebServers.DataStream dd) + { + } public void EnqueueOutputData(byte[] dataToSend, int count) { @@ -196,7 +200,7 @@ public void EnqueueOutputData(byte[] dataToSend, int count) public int QueueCount => _sendingQueue.Count; - + public void StartSendAsync() { lock (_stateLock) diff --git a/src/SharpConnect.WebServer/HttpWebServer2/HttpsContext.cs b/src/SharpConnect.WebServer/HttpWebServer2/HttpsContext.cs index f123f58..452e182 100644 --- a/src/SharpConnect.WebServer/HttpWebServer2/HttpsContext.cs +++ b/src/SharpConnect.WebServer/HttpWebServer2/HttpsContext.cs @@ -97,7 +97,7 @@ public HttpsContext( internal bool CreatedFromPool { get; set; } public void EnqueueSendingData(byte[] buffer, int len) => _sockStream.EnqueueSendData(buffer, len); - + public void EnqueueSendingData(DataStream dataStream) => _sockStream.EnqueueSendData(dataStream); public int RecvByteTransfer => _sockStream.ByteReadTransfered; public byte ReadByte(int pos) => _sockStream.RecvReadByte(pos); public void RecvCopyTo(int readpos, byte[] dstBuffer, int copyLen) => _sockStream.RecvCopyTo(readpos, dstBuffer, copyLen); @@ -326,7 +326,7 @@ void HandleReceive(RecvEventCode recvEventCode) } break; case ProcessReceiveBufferResult.NeedMore: - { + { } break; diff --git a/src/SharpConnect.WebServer/HttpWebServer2/HttpsWebServer.cs b/src/SharpConnect.WebServer/HttpWebServer2/HttpsWebServer.cs index 170f457..cd87a4e 100644 --- a/src/SharpConnect.WebServer/HttpWebServer2/HttpsWebServer.cs +++ b/src/SharpConnect.WebServer/HttpWebServer2/HttpsWebServer.cs @@ -22,7 +22,7 @@ public HttpsWebServer(int port, bool localOnly, ReqRespHandler { - //when accept new client + //when accept new client - int recvSize = 1024 * 2; + int recvSize = 1024 * 2; int sendSize = 1024 * 2; HttpsContext context = new HttpsContext(this, recvSize, sendSize); context.BindReqHandler(_reqHandler); //client handler #if DEBUG - context.dbugForHttps = true; + context.dbugForHttps = true; #endif - context.BindSocket(clientSocket); //*** bind to client socket - //for ssl -> cert must not be null - context.StartReceive(_serverCert); - //TODO:: - //USE https context from Pool???? - //{ - // HttpsContext context = _contextPool.Pop(); - // context.BindSocket(clientSocket); //*** bind to client socket - // context.StartReceive(UseSsl ? _serverCert : null); - //} - }); + context.BindSocket(clientSocket); //*** bind to client socket + //for ssl -> cert must not be null + context.StartReceive(_serverCert); + //TODO:: + //USE https context from Pool???? + //{ + // HttpsContext context = _contextPool.Pop(); + // context.BindSocket(clientSocket); //*** bind to client socket + // context.StartReceive(UseSsl ? _serverCert : null); + //} + }); //------------------------------ @@ -156,7 +159,6 @@ internal bool CheckWebSocketUpgradeRequest(HttpsContext httpConn) } HttpRequest httpReq = httpConn.HttpReq; - HttpResponse httpResp = httpConn.HttpResp; string upgradeKey = httpReq.GetHeaderKey("Upgrade"); if (upgradeKey != null && upgradeKey == "websocket") { diff --git a/src/SharpConnect.WebServer/HttpWebServer2/RecvIO_SendIO_2.cs b/src/SharpConnect.WebServer/HttpWebServer2/RecvIO_SendIO_2.cs index b471377..8e4f1c4 100644 --- a/src/SharpConnect.WebServer/HttpWebServer2/RecvIO_SendIO_2.cs +++ b/src/SharpConnect.WebServer/HttpWebServer2/RecvIO_SendIO_2.cs @@ -143,7 +143,7 @@ public int ReadBufferTo(byte[] dstBuffer, int dstIndex, int count) return availableLen; } else - { + { Buffer.BlockCopy(_largeBuffer, _startAt + _readIndex, dstBuffer, _startAt + dstIndex, count); _readIndex += count; return count; @@ -251,6 +251,10 @@ public void Reset() } _sendingQueue.Clear(); } + } + public void EnqueueOutputData(SharpConnect.WebServers.DataStream dataStream) + { + } public void EnqueueOutputData(byte[] dataToSend, int count) { diff --git a/src/SharpConnect.WebServer/HttpWebServer2/SockAsyncNetworkStream.cs b/src/SharpConnect.WebServer/HttpWebServer2/SockAsyncNetworkStream.cs index abbea37..47f11f2 100644 --- a/src/SharpConnect.WebServer/HttpWebServer2/SockAsyncNetworkStream.cs +++ b/src/SharpConnect.WebServer/HttpWebServer2/SockAsyncNetworkStream.cs @@ -5,6 +5,7 @@ using System.Net.Sockets; using System.Net.Security; using System.Threading; +using SharpConnect.WebServers; namespace SharpConnect.Internal2 { @@ -68,6 +69,7 @@ protected void RaiseRecvCompleted(int byteCount) internal abstract byte RecvReadByte(int pos); internal abstract void EnqueueSendData(byte[] buffer, int len); + internal abstract void EnqueueSendData(DataStream dataStream); internal abstract void RecvCopyTo(int readpos, byte[] dstBuffer, int copyLen); internal abstract void UnbindSocket(); @@ -166,7 +168,10 @@ internal override void EnqueueSendData(byte[] buffer, int len) { _sendIO.EnqueueOutputData(buffer, len); } - + internal override void EnqueueSendData(DataStream dataStream) + { + _sendIO.EnqueueOutputData(dataStream); + } public void Bind(Socket socket) { @@ -1036,7 +1041,11 @@ internal override void EnqueueSendData(byte[] buffer, int len) _enqueueOutputData.Write(buffer, 0, len); } } - + internal override void EnqueueSendData(DataStream dataStream) + { + //TODO: implement this + throw new NotImplementedException(); + } readonly object _startSendLock = new object(); bool _startSending; diff --git a/src/SharpConnect.WebServer/WebSocket/PlainWebSocketConn.cs b/src/SharpConnect.WebServer/WebSocket/PlainWebSocketConn.cs index 247d94b..a38e043 100644 --- a/src/SharpConnect.WebServer/WebSocket/PlainWebSocketConn.cs +++ b/src/SharpConnect.WebServer/WebSocket/PlainWebSocketConn.cs @@ -144,8 +144,9 @@ public void Bind(Socket clientSocket, byte[] connReplMsg) //-------- } void ISendIO.EnqueueSendingData(byte[] buffer, int len) => _sendIO.EnqueueOutputData(buffer, len); + void ISendIO.EnqueueSendingData(DataStream dataStream) => _sendIO.EnqueueOutputData(dataStream); void ISendIO.SendIOStartSend() => _sendIO.StartSendAsync(); - + bool _beginWebSocketMode; void HandleReceivedData(RecvEventCode recvCode) { @@ -165,9 +166,9 @@ void HandleReceivedData(RecvEventCode recvCode) if (text.StartsWith("HTTP/1.1 101 Switching Protocols\r\nUpgrade")) { //clear prev buffer - + _webSocketReqParser.ClearMemBuffer(); - _beginWebSocketMode = true; + _beginWebSocketMode = true; _recvIO.StartReceive(); ////*** clear prev buffer before new recv diff --git a/src/SharpConnect.WebServer/WebSocket/SecureWebSocketConn.cs b/src/SharpConnect.WebServer/WebSocket/SecureWebSocketConn.cs index a240afa..5416289 100644 --- a/src/SharpConnect.WebServer/WebSocket/SecureWebSocketConn.cs +++ b/src/SharpConnect.WebServer/WebSocket/SecureWebSocketConn.cs @@ -104,6 +104,7 @@ void ISendIO.EnqueueSendingData(byte[] buffer, int len) { _clientStream.EnqueueSendData(buffer, len); } + void ISendIO.EnqueueSendingData(DataStream dataStream) => _clientStream.EnqueueSendData(dataStream); void ISendIO.SendIOStartSend() => _clientStream.StartSend(); diff --git a/tests/WebServerApp/Program.cs b/tests/WebServerApp/Program.cs index e10a814..ad9c03e 100644 --- a/tests/WebServerApp/Program.cs +++ b/tests/WebServerApp/Program.cs @@ -8,10 +8,16 @@ namespace SharpConnect static class Program { static void Main(string[] args) - { + { Main_Http(); //Main_Https(); } + + static void HandleWebReq(WebServers.HttpRequest req, WebServers.HttpResponse resp) + { + resp.End("OK"); + } + static List s_contextList = new List(); diff --git a/tests/WebServerApp/WebServerApp.shproj b/tests/WebServerApp/WebServerApp_SH.shproj similarity index 100% rename from tests/WebServerApp/WebServerApp.shproj rename to tests/WebServerApp/WebServerApp_SH.shproj