private void HandlePOSTRequest(IStreamWrapper inputStream, IStreamWriterWrapper outputStream) { // this post data processing just reads everything into a memory stream. // this is fine for smallish things, but for large stuff we should really // hand an input stream to the request processor. However, the input stream // we hand him needs to let him see the "end of the stream" at this content // length, because otherwise he won't know when he's seen it all! //Console.WriteLine("get post data start"); using (var ms = streamFactory.GetMemoryStreamWrapper()) { if (httpHeaders.ContainsKey("Content-Length")) { var contentLen = Convert.ToInt32(httpHeaders["Content-Length"]); if (contentLen > MaxPostSize) { throw new Exception($"POST Content-Length({contentLen}) too big for this server"); } var buf = new byte[BufSize]; var toRead = contentLen; while (toRead > 0) { //Console.WriteLine("starting Read, to_read={0}", toRead); var numread = inputStream.Read(buf, 0, Math.Min(BufSize, toRead)); //Console.WriteLine("read finished, numread={0}", numread); if (numread == 0) { if (toRead == 0) { break; } throw new Exception("client disconnected during post"); } toRead -= numread; ms.Write(buf, 0, numread); } ms.Seek(0, SeekOrigin.Begin); } //Console.WriteLine("get post data end"); postHandler(httpUrl, ms, outputStream); } }
protected abstract void HandlePOSTRequest(string httpUrl, IMemoryStreamWrapper ms, IStreamWriterWrapper outputStream);
//public void WriteSuccess(StreamWriter outputStream) //{ // outputStream.Write("HTTP/1.0 200 OK\n"); // outputStream.Write("Content-Type: text/html\n"); // outputStream.Write("Connection: close\n"); // outputStream.Write("\n"); //} // ReSharper disable once SuggestBaseTypeForParameter private static void WriteFailure(IStreamWriterWrapper outputStream) { outputStream.Write("HTTP/1.0 404 File not found\n"); outputStream.Write("Connection: close\n"); outputStream.Write("\n"); }
protected override async void HandlePOSTRequest(string httpUrl, IMemoryStreamWrapper ms, IStreamWriterWrapper outputStream) { var json = encryptor.DecryptStringFromBytes(ms.ToArray()); switch (httpUrl) { case "/serverInfoUpdate": { var serverInfo = JsonConvert.DeserializeObject <ServerInfo>(json); var serverWasUpdated = await serversProvider.UpdateServer(serverInfo); if (!serverWasUpdated) { stripMessenger.StripMessage = $"Added new server: {serverInfo.Name} - {serverInfo.Ip}:{serverInfo.Port} ({serverInfo.Region})"; } return; } case "/getServerToConnectTo": { var playerInfo = JsonConvert.DeserializeObject <PlayerInfo>(json); var serverJson = serversProvider.SelectServerForPlayerJson(playerInfo); var serverInfoBytes = encryptor.EncryptStringToBytes(serverJson); outputStream.WriteThroughBaseStream(serverInfoBytes, 0, serverInfoBytes.Length); stripMessenger.StripMessage = "Query 'getServerToConnectTo' have been successfully processed"; return; } } throw new Exception("Unknown query"); }