public DataFlowOpInitializeResult Initialize(DataFlowOpInitializateContext initContext) { var dataflowContext = initContext.DataflowInstanceUserObject as DataflowContext; var log = dataflowContext.Resolve<ILogger>(); var port = ChoosePort(Port, new[] { 80, 8080 }); if(port.HasValue == false) { log.Error("Unable to bind to port {Port}", Port); } var tcpListener = new TcpListener(IPAddress.Any, port.Value); tcpListener.Start(100); log.Information("Port open {Endpoint}", tcpListener.LocalEndpoint.ToString()); Task.Factory.StartNew(async () => { while (true) { var tcpClient = await tcpListener.AcceptTcpClientAsync(); var stream = tcpClient.GetStream(); var context = new HttpContext() { Connection = tcpClient, Request = new HttpRequest(stream), Response = new HttpResponse(stream) }; await context.Request.ReadHeadersAsync(); log = log.ForContext(new[] { new CorrelationEnricher(context.Correlation.ToString()) }); context.Properties.Add("Log", log); log.Information("Request Accepted {Correlation}", context.Correlation); log.Verbose("{@Block} {@Request}", this, context.Request); Emitter.Submit(context); } }); var httpContext = initContext.ServicesContext.EventAdapterService.GetEventTypeByName("HttpContext"); return new DataFlowOpInitializeResult(new[] { new com.espertech.esper.dataflow.util.GraphTypeDesc(false, false, httpContext) }); }
//private async Task<ServiceDto> CallConsul(HttpContext context, ILogger log, string serviceName) //{ // try // { // var data = new ServiceDto(); // log.Verbose("Searching service in Consul..."); // using (var client = new ConsulClient()) // { // var consulCatalog = await client.Catalog.Service(serviceName); // if (consulCatalog.Response.Length > 0) // { // var service = consulCatalog.Response[0]; // data.Address = IPAddress.Parse(service.Address); // data.Port = service.ServicePort; // log.Information("Sending request to {Host}:{port}...", service.Address, data.Port); // } // else // { // log.Warning("Service not found!"); // context.Response.Send(404); // } // } // return data; // } // catch (Exception e) // { // log.Error(e, "Cannot call Consul"); // context.Response.Send(500); // return null; // } //} private static async Task CallService(HttpContext context, HttpRequest request, ILogger log, ServiceInfo serviceInfo) { IPAddress serviceAdress = IPAddress.Parse(serviceInfo.Address); int servicePort = serviceInfo.Port; using (context) { try { using (var client = new TcpClient()) { client.Connect(serviceAdress, servicePort); using (var realService = client.GetStream()) { log.Verbose("Sending request..."); await request.RedirectToAsync(realService); log.Verbose("Waiting response..."); await context.Response.RedirectFromAsync(realService); log.Information("Finished!"); } } } catch (Exception e) { log.Error(e, "Cannot call service"); context.Response.Send(500); } } }