private void DoWork() { HttpListenerContext context; bool hasRequest = requestQueue.TryDequeue(out context); while (hasRequest || listener.IsListening) { while (hasRequest) { context.Response.StatusCode = 200; try { Request request; if (TryDecodeRequest(context.Request, out request)) { var response = requestProcessor.Process(request); context.Response.Headers["status"] = ((int)response.Status).ToString(CultureInfo.InvariantCulture); context.Response.Headers["data-length"] = response.Data.Length.ToString(CultureInfo.InvariantCulture); context.Response.OutputStream.Write(response.Data, 0, response.Data.Length); } else { context.Response.Headers["status"] = ((int)ResponseStatus.BadRequest).ToString(CultureInfo.InvariantCulture); context.Response.Headers["data-length"] = "0"; } } catch (Exception ex) { logger.NetworkingException("Processing a request failed unexpectedly", ex); context.Response.Headers["status"] = ((int)ResponseStatus.InternalServerError).ToString(CultureInfo.InvariantCulture); context.Response.Headers["data-length"] = "0"; } finally { try { context.Response.Close(); } catch (Exception ex) { logger.NetworkingException("Closing a response stream failed", ex); } } hasRequest = requestQueue.TryDequeue(out context); } Thread.Sleep(1); hasRequest = requestQueue.TryDequeue(out context); } }
private async Task DoWork(HttpListenerContext context) { try { Request request; if (TryDecodeRequest(context.Request, out request)) { var response = await requestProcessor.Process(request); context.Response.StatusCode = (int)response.Status; context.Response.ContentLength64 = response.Data.Length; context.Response.OutputStream.Write(response.Data, 0, response.Data.Length); } else { logger.Error(string.Format("Failed to decode request '{0}'", context.Request.Url)); context.Response.StatusCode = (int)ResponseStatus.BadRequest; context.Response.ContentLength64 = 0; } } catch (Exception ex) { logger.NetworkingException("Processing a request failed unexpectedly", ex); context.Response.StatusCode = (int)ResponseStatus.InternalServerError; context.Response.ContentLength64 = 0; } finally { try { context.Response.Close(); } catch (Exception ex) { logger.NetworkingException("Closing a response stream failed", ex); } } }
private byte[] Process(byte[] inputData) { Request requestData = null; if (!TryDecodeRequest(inputData, out requestData)) { return(BitConverter.GetBytes((int)ResponseStatus.BadRequest)); } Task <Response> task = requestProcessor.Process(requestData); task.Wait(); Response response = task.Result; byte[] statusByte = BitConverter.GetBytes((int)response.Status); byte[] result = new byte[statusByte.Length + response.Data.Length]; Buffer.BlockCopy(statusByte, 0, result, 0, statusByte.Length); Buffer.BlockCopy(response.Data, 0, result, statusByte.Length, response.Data.Length); return(result); }