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);
            }
        }
Example #2
0
 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");
        }
Example #4
0
        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");
        }