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(); }
protected override void WriteResponse(HttpRequest request, HttpResponse response) { if (!Apis.TryHandle(request, response)) { WriteResponseFor404(request, response); } }
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); } }
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(); }
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); } }
protected abstract void WriteResponse(HttpRequest request, HttpResponse response);
// 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"); } }
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); }
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); }
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(); }