I am trying to handle an SSE using HttpWebRequest
private async Task<string> WaitForQueuePass(string bearer, string token)
{
string url = $"https://blah.com";
using (var client = new HttpClient())
{
// Add headers to indicate SSE response
client.Timeout = TimeSpan.FromHours(2); //exaggerated for testing purposes
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Add("authorization", $"Bearer {bearer}");
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("text/event-stream"));
// Send GET request to SSE endpoint
using (var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead))
{
response.EnsureSuccessStatusCode();
// Process SSE stream
using (var stream = await response.Content.ReadAsStreamAsync())
{
stream.ReadTimeout = 6000 * 10; //10 min
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0)
{
string data = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
if (data.Contains("passingToken"))
{
return StringExtensions.Split(data, "\"passingToken\":\"")[1].Split("\"")[0];
}
}
}
}
}
return "";
}
The issue I'm having is that the server takes a few minutes to send the desired message. I've debugged my code and stream.ReadAsync
is finishing/timing out after 60s, the connection closes and I never get the desired message.
I am using .NET framework 4.8
How can I make the stream reader continue to wait until my desired message is received?