Example #1
0
        void WriteResponseForPostJson(HttpRequest request, HttpResponse response)
        {
            // read request json
            int requestedCount;
            using (var dom = JsonObject.Parse(request.Body)) {
                requestedCount = (int)dom["Count"];
            }

            // write response JSON
            var jsonWriter = new JsonWriter<ResponseFormatter>(response.Body, prettyPrint: false);
            jsonWriter.WriteObjectStart();
            jsonWriter.WriteArrayStart();
            for (int i = 0; i < requestedCount; i++)
            {
                jsonWriter.WriteString("hello!");
            }
            jsonWriter.WriteArrayEnd();
            jsonWriter.WriteObjectEnd();

            // write headers
            var headers = response.Headers;
            headers.AppendHttpStatusLine(HttpVersion.V1_1, 200, new Utf8String("OK"));
            headers.Append("Content-Length : ");
            headers.Append(response.Body.WrittenBytes);
            headers.AppendHttpNewLine();
            headers.Append("Content-Type : text/plain; charset=UTF-8");
            headers.AppendHttpNewLine();
            headers.Append("Server : .NET Core Sample Server");
            headers.AppendHttpNewLine();
            headers.Append("Date : ");
            headers.Append(DateTime.UtcNow, 'R');
            headers.AppendHttpNewLine();
            headers.AppendHttpNewLine();
        }
Example #2
0
 protected override void WriteResponse(HttpRequest request, HttpResponse response)
 {
     if (!Apis.TryHandle(request, response))
     {
         WriteResponseFor404(request, response);
     }
 }
Example #3
0
        protected virtual void ProcessRequest(TcpConnection socket)
        {
            Log.LogVerbose("Processing Request");
            
            var requestBuffer = s_pool.Rent(RequestBufferSize);
            var requestByteCount = socket.Receive(requestBuffer);

            if(requestByteCount == 0) {
                socket.Close();
                return;
            }

            var requestBytes = requestBuffer.Slice(0, requestByteCount);
            var request = HttpRequest.Parse(requestBytes);
            Log.LogRequest(request);

            using (var response = new HttpResponse(1024)) {
                WriteResponse(request, response);
                s_pool.Return(requestBuffer);

                foreach(var segment in response.Headers) {
                    socket.Send(segment);
                }
                foreach (var segment in response.Body) {
                    socket.Send(segment);
                }

                socket.Close();
            }

            if (Log.IsVerbose)
            {
                Log.LogMessage(Log.Level.Verbose, "Request Processed and Response Sent", DateTime.UtcNow.Ticks);
            }
        }
Example #4
0
        static void WriteResponseForHelloWorld(HttpRequest request, HttpResponse response)
        {
            response.Body.Append("Hello, World");

            response.Headers.AppendHttpStatusLine(HttpVersion.V1_1, 200, new Utf8String("OK"));
            response.Headers.Append("Content-Length : ");
            response.Headers.Append(response.Body.WrittenBytes);
            response.Headers.AppendHttpNewLine();
            response.Headers.Append("Content-Type : text/plain; charset=UTF-8");
            response.Headers.AppendHttpNewLine();
            response.Headers.Append("Server : .NET Core Sample Server");
            response.Headers.AppendHttpNewLine();
            response.Headers.Append("Date : ");
            response.Headers.Append(DateTime.UtcNow, 'R');
            response.Headers.AppendHttpNewLine();
            response.Headers.AppendHttpNewLine();
        }
Example #5
0
        protected virtual void ProcessRequest(TcpConnection socket)
        {
            Log.LogVerbose("Processing Request");
            
            var requestBuffer = s_pool.Rent(RequestBufferSize);
            var requestByteCount = socket.Receive(requestBuffer);

            if(requestByteCount == 0) {
                socket.Close();
                return;
            }

            var requestBytes = requestBuffer.Slice(0, requestByteCount);
            var request = HttpRequest.Parse(requestBytes);
            Log.LogRequest(request);

            using (var responseData = new ResponseBuffer()) {
                var response = new HttpResponse(responseData);
                WriteResponse(request, response);
                s_pool.Return(requestBuffer);

                // TODO: this whole thing about segment order is very bad. It needs to be designed.
                for (int index = 0; index < responseData.Count; index++) {
                    var segment = responseData[index];
                    if (segment.Id == 2) {
                        socket.Send(segment.Commited);
                    }
                }
                for (int index = 0; index < responseData.Count; index++) {
                    var segment = responseData[index];
                    if (segment.Id == 1) {
                        socket.Send(segment.Commited);
                    }
                }

                socket.Close();
            }

            if (Log.IsVerbose)
            {
                Log.LogMessage(Log.Level.Verbose, "Request Processed and Response Sent", DateTime.UtcNow.Ticks);
            }
        }
Example #6
0
 protected abstract void WriteResponse(HttpRequest request, HttpResponse response);
Example #7
0
        // TODO: this is not a very general purpose routine. Maybe should not be in this base class?
        protected static void WriteCommonHeaders(
            HttpResponse formatter,
            HttpVersion version,
            int statuCode,
            string reasonCode,
            bool keepAlive)
        {
            var currentTime = DateTime.UtcNow;
            formatter.Headers.AppendHttpStatusLine(version, statuCode, new Utf8String(reasonCode));
            formatter.Headers.Append(new Utf8String("Date : ")); formatter.Headers.Append(currentTime, 'R');
            formatter.Headers.AppendHttpNewLine();
            formatter.Headers.Append("Server : .NET Core Sample Server");
            formatter.Headers.AppendHttpNewLine();
            formatter.Headers.Append("Content-Type : text/html; charset=UTF-8");
            formatter.Headers.AppendHttpNewLine();

            if (!keepAlive)
            {
                formatter.Headers.Append("Connection : close");
            }
        }
Example #8
0
 protected virtual void WriteResponseFor404(HttpRequest request, HttpResponse response) // Not Found
 {
     Log.LogMessage(Log.Level.Warning, "Request {0}, Response: 404 Not Found", request.RequestLine);
     WriteCommonHeaders(response, HttpVersion.V1_1, 404, "Not Found", false);
     response.Headers.Append(HttpNewline);
 }
Example #9
0
 protected virtual void WriteResponseFor400(Span<byte> requestBytes, HttpResponse response) // Bad Request
 {
     Log.LogMessage(Log.Level.Warning, "Request {0}, Response: 400 Bad Request", requestBytes.Length);
     WriteCommonHeaders(response, HttpVersion.V1_1, 400, "Bad Request", false);
     response.Headers.Append(HttpNewline);
 }
Example #10
0
        static void WriteResponseForGetTime(HttpRequest request, HttpResponse response)
        {
            response.Body.Format(@"<html><head><title>Time</title></head><body>{0:O}</body></html>", DateTime.UtcNow);

            WriteCommonHeaders(response, HttpVersion.V1_1, 200, "OK", keepAlive: false);
            response.Headers.Append("Content-Length : ");
            response.Headers.Append(response.Body.WrittenBytes);
            response.Headers.AppendHttpNewLine();
            response.Headers.AppendHttpNewLine();
        }