Skip to content

Commit eb1c24c

Browse files
author
Sergey Kuznetsov
committed
fix HttpListener
1 parent ba02cf8 commit eb1c24c

File tree

2 files changed

+34
-15
lines changed

2 files changed

+34
-15
lines changed

src/Prometheus.Client.MetricServer/MetricServer.HttpListener.cs

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
using System.Collections.Generic;
44
using System.Net;
55
using Prometheus.Client.Collectors;
6+
using System.IO;
7+
using System.Text;
8+
using System.Diagnostics;
69

710
namespace Prometheus.Client.MetricServer
811
{
@@ -12,6 +15,7 @@ namespace Prometheus.Client.MetricServer
1215
public class MetricServer : BaseMetricServer, IMetricServer
1316
{
1417
private readonly HttpListener _httpListener = new HttpListener();
18+
private bool _isListening = false;
1519

1620
/// <summary>
1721
/// Constructor
@@ -51,32 +55,47 @@ public MetricServer(string hostname, int port, string url, IEnumerable<IOnDemand
5155
public void Start()
5256
{
5357
_httpListener.Start();
54-
_httpListener.BeginGetContext(ar =>
58+
_isListening = true;
59+
60+
while (_isListening)
5561
{
56-
var httpListenerContext = _httpListener.EndGetContext(ar);
57-
var request = httpListenerContext.Request;
58-
var response = httpListenerContext.Response;
62+
try
63+
{
64+
HttpListenerContext context = _httpListener.GetContext();
65+
HttpListenerRequest request = context.Request;
66+
HttpListenerResponse response = context.Response;
5967

60-
response.StatusCode = 200;
68+
string requestBody;
69+
Stream inputStream = request.InputStream;
70+
Encoding encoding = request.ContentEncoding;
71+
StreamReader reader = new StreamReader(inputStream, encoding);
72+
requestBody = reader.ReadToEnd();
73+
response.StatusCode = 200;
6174

62-
var acceptHeader = request.Headers.Get("Accept");
63-
var acceptHeaders = acceptHeader?.Split(',');
64-
var contentType = ScrapeHandler.GetContentType(acceptHeaders);
65-
response.ContentType = contentType;
75+
var acceptHeader = request.Headers.Get("Accept");
76+
var acceptHeaders = acceptHeader?.Split(',');
77+
var contentType = ScrapeHandler.GetContentType(acceptHeaders);
78+
response.ContentType = contentType;
79+
80+
using (Stream outputStream = response.OutputStream)
81+
{
82+
var collected = Registry.CollectAll();
83+
ScrapeHandler.ProcessScrapeRequest(collected, contentType, outputStream);
84+
}
85+
}
6686

67-
using (var outputStream = response.OutputStream)
87+
catch (HttpListenerException ex)
6888
{
69-
var collected = Registry.CollectAll();
70-
ScrapeHandler.ProcessScrapeRequest(collected, contentType, outputStream);
89+
Trace.WriteLine($"Error in MetricsServer: {ex}");
7190
}
91+
}
7292

73-
response.Close();
74-
}, null);
7593
}
7694

7795
/// <inheritdoc />
7896
public void Stop()
7997
{
98+
_isListening = false;
8099
_httpListener.Stop();
81100
_httpListener.Close();
82101
}

src/Prometheus.Client.MetricServer/Prometheus.Client.MetricServer.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<Description>MetricServer for the Prometheus.Client</Description>
55
<Copyright>2017 © Sergey Kuznetsov</Copyright>
66
<AssemblyTitle>Prometheus.Client.MetricServer</AssemblyTitle>
7-
<VersionPrefix>1.1.0</VersionPrefix>
7+
<VersionPrefix>1.1.1</VersionPrefix>
88
<Authors>Sergey Kuznetsov</Authors>
99
<TargetFrameworks>net45;netstandard1.3</TargetFrameworks>
1010
<AssemblyName>Prometheus.Client.MetricServer</AssemblyName>

0 commit comments

Comments
 (0)