public void Parse(HttpListenerContext httpContext) { try { var httpRequest = httpContext.Request; using (var reader = new StreamReader(httpRequest.InputStream, Encoding.UTF8)) { var line = reader.ReadToEnd(); var rpcContext = new HttpServiceContext(this, httpContext); _packetLogger.Verbose("rx: {0}", line.PrettifyJson()); var async = new JsonRpcStateAsync(_rpcResultHandler, rpcContext) { JsonRpc = line }; JsonRpcProcessor.Process(Pool.Config.Coin.Name, async, rpcContext); } } catch (JsonReaderException e) // if client sent an invalid message { _logger.Error("Skipping invalid json-rpc request - {0:l}", e.Message); } }
/// <summary> /// derived class must implement to handle Post request /// </summary> protected override HttpServiceResponse ProcessPostRequest(HttpServiceContext context) { BaseServiceNode service = _service as BaseServiceNode; if (service == null) { return(CreateResponseForBadRequest(context, Name, $"PostNotSupported {context.Context.Request.Url.AbsoluteUri}")); } string dataName = nameof(BaseServiceNode.Status); if (context.UnmatchedSegments?.Count > 0 && string.Equals(dataName, context.UnmatchedSegments[0], StringComparison.OrdinalIgnoreCase)) { SensorStatusData data = null; string json = GetFromRequestStream(context.Context.Request); try { data = JsonConvert.DeserializeObject <SensorStatusData>(json); } catch (Exception err) { return(CreateResponseForBadRequest(context, Name, $"InvalidData {json}")); } service.SetStatus(data.SensorRate, data.IsOn); return(CreateSuccessResponse(context, Name, 200)); } return(CreateResponseForBadRequest(context, Name, $"InvalidPostRequestPath {context.Context.Request.Url.AbsoluteUri}")); }
/// <summary> /// derived class must implement to handle Post request /// </summary> protected override HttpServiceResponse ProcessPostRequest(HttpServiceContext context) { T data = null; string json = GetFromRequestStream(context.Context.Request); try { data = JsonConvert.DeserializeObject <T>(json); } catch (Exception err) { return(CreateResponseForBadRequest(context, Name, $"InvalidData: {json}")); } if (_service.RequireUiThread) { UiActionBag.Instance.AddAction(_service, data); return(CreateSuccessResponse(context, Name, 200, $"{Path} ActionScheduled")); } if (_service.Act(data)) { return(CreateSuccessResponse(context, Name, 200, $"{Path} ActionProcessed")); } return(CreateResponseForBadRequest(context, Name, $"{Path} Action Failed")); }
/// <summary> /// derived class must implement to handle Post request /// </summary> protected override HttpServiceResponse ProcessPostRequest(HttpServiceContext context) { SubscriptionData subscriptionData = null; string json = GetFromRequestStream(context.Context.Request); try { subscriptionData = JsonConvert.DeserializeObject <SubscriptionData>(json); } catch (Exception err) { return(CreateResponseForBadRequest(context, Name, $"InvalidSubscription: {json}")); } if (!ValidateSubscriptionData(subscriptionData)) { return(CreateResponseForBadRequest(context, Name)); } HttpServiceResponse response = null; HttpTargetSite target = subscriptionData.Target; string invalidList = string.Empty; int okCount = 0; foreach (SubscriptionItem item in subscriptionData.Items) { bool ok = Subscribe(item, target); if (ok) { okCount++; } else { if (!string.IsNullOrEmpty(invalidList)) { invalidList += ", "; } invalidList += $"{item.Node}.{item.Data}"; } } if (string.IsNullOrEmpty(invalidList)) { response = CreateSuccessResponse(context, Name, 200, null); } else { string invalidJson = $"{{\"subscriptionError\": \"{invalidList}\"}}"; if (okCount > 0) { response = CreateSuccessResponse(context, Name, 206, invalidJson); } else { CreateResponse(context, Name, false, 400, invalidJson); } } return(response); }
/// <summary> /// derived class must implement to handle GET request /// </summary> protected override HttpServiceResponse ProcessGetRequest(HttpServiceContext context) { HttpListenerRequest request = context.Context.Request; HttpListenerResponse response = context.Context.Response; // only respond if the request is to the quit path if (string.Equals(Path, request.Url.AbsolutePath, StringComparison.OrdinalIgnoreCase)) { _quitRequested = true; return(CreateSuccessResponse(context, Name, 200, "{ \"response\": \"Quiting\" }")); } return(CreateResponseForBadRequest(context, Name, "InvalidRootPath: " + request.Url.AbsolutePath)); }
/// <summary> /// derived class must implement to handle GET request /// </summary> protected override HttpServiceResponse ProcessGetRequest(HttpServiceContext context) { HttpListenerRequest request = context.Context.Request; HttpListenerResponse response = context.Context.Response; string dataName = _defaultDataName; if (context.UnmatchedSegments?.Count > 0) { dataName = context.UnmatchedSegments[0]; } IotData data = _service.GetData <IotData>(dataName); if (data != null) { string responseString = JsonConvert.SerializeObject(data, DefaultJsonSerializerSettings); response.ContentType = "application/json"; return(CreateSuccessResponse(context, Name, 200, responseString)); } return(CreateResponseForBadRequest(context, Name, $"InvalidDataName: {dataName}")); }
/// <summary> /// derived class must implement to handle Post request /// </summary> protected override HttpServiceResponse ProcessPostRequest(HttpServiceContext context) { return(ProcessGetRequest(context)); }