public void MakeRequest(Batch batch)
{
Stopwatch watch = new Stopwatch();
try
{
Uri uri = new Uri(_client.Config.Host + "/v1/import");
// set the current request time
batch.SentAt = DateTime.Now.ToString("o");
string json = JsonConvert.SerializeObject(batch, settings);
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(uri);
// Basic Authentication
// https://segment.io/docs/tracking-api/reference/#authentication
request.Headers["Authorization"] = BasicAuthHeader(batch.WriteKey, "");
request.Timeout = (int)Timeout.TotalMilliseconds;
request.ContentType = "application/json";
request.Method = "POST";
// do not use the expect 100-continue behavior
request.ServicePoint.Expect100Continue = false;
// buffer the data before sending, ok since we send all in one shot
request.AllowWriteStreamBuffering = true;
Logger.Info("Sending analytics request to Segment.io ..", new Dict
{
{ "batch id", batch.MessageId },
{ "json size", json.Length },
{ "batch size", batch.batch.Count }
});
watch.Start();
using (var requestStream = request.GetRequestStream())
{
using (StreamWriter writer = new StreamWriter(requestStream))
{
writer.Write(json);
}
}
using (var response = (HttpWebResponse)request.GetResponse())
{
watch.Stop();
if (response.StatusCode == HttpStatusCode.OK)
{
Succeed(batch, watch.ElapsedMilliseconds);
}
else
{
string responseStr = String.Format("Status Code {0}. ", response.StatusCode);
responseStr += ReadResponse(response);
Fail(batch, new APIException("Unexpected Status Code", responseStr), watch.ElapsedMilliseconds);
}
}
}
catch (WebException e)
{
watch.Stop();
Fail(batch, ParseException(e), watch.ElapsedMilliseconds);
}
catch (System.Exception e)
{
watch.Stop();
Fail(batch, e, watch.ElapsedMilliseconds);
}
}