diff --git a/JetHerald/Controllers/HeartbeatController.cs b/JetHerald/Controllers/HeartbeatController.cs index 8ee707f..a63a490 100644 --- a/JetHerald/Controllers/HeartbeatController.cs +++ b/JetHerald/Controllers/HeartbeatController.cs @@ -1,7 +1,12 @@ using System; +using System.IO; using System.Runtime.Serialization; +using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.ModelBinding; namespace JetHerald.Controllers { @@ -17,9 +22,41 @@ namespace JetHerald.Controllers Db = db; } + // tfw when you need to manually parse body and query [Route("api/heartbeat")] [HttpPost] - public async Task Heartbeat([FromBody] HeartbeatArgs args) + public async Task Heartbeat() + { + var q = Request.Query; + if (q.ContainsKey("Topic") + && q.ContainsKey("ExpiryTimeout") + && q.ContainsKey("WriteToken")) + { + HeartbeatArgs args = new(); + args.Topic = q["Topic"]; + args.WriteToken = q["WriteToken"]; + if (!int.TryParse(q["ExpiryTimeout"], out args.ExpiryTimeout)) + { + return BadRequest(); + } + return await DoHeartbeat(args); + } + + try + { + var args = await JsonSerializer.DeserializeAsync(HttpContext.Request.Body, new JsonSerializerOptions() + { + IncludeFields = true + }); + return await DoHeartbeat(args); + } + catch (JsonException) + { + return BadRequest(); + } + } + + private async Task DoHeartbeat(HeartbeatArgs args) { var t = await Db.GetTopic(args.Topic); if (t == null) @@ -35,12 +72,11 @@ namespace JetHerald.Controllers return new OkResult(); } - [DataContract] public class HeartbeatArgs { - [DataMember] public string Topic { get; set; } - [DataMember] public int ExpiryTimeout { get; set; } - [DataMember] public string WriteToken { get; set; } + [JsonPropertyName("Topic")] public string Topic; + [JsonPropertyName("ExpiryTimeout")] public int ExpiryTimeout; + [JsonPropertyName("WriteToken")] public string WriteToken; } } } \ No newline at end of file