From a4c649199d03a1a84bf06f5d9b8e476a382afc51 Mon Sep 17 00:00:00 2001 From: Adam Stiskala Date: Fri, 12 Jul 2019 12:21:39 +1000 Subject: [PATCH 1/2] Add support for a configurable HTTP timeout (cherry picked from commit de4bfefa91fb95045160ecf8cc2fa5cdc9c4ee4f) --- src/Typesafe.Mailgun/Http/MailgunHttpRequest.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Typesafe.Mailgun/Http/MailgunHttpRequest.cs b/src/Typesafe.Mailgun/Http/MailgunHttpRequest.cs index a2080f7..ea83343 100644 --- a/src/Typesafe.Mailgun/Http/MailgunHttpRequest.cs +++ b/src/Typesafe.Mailgun/Http/MailgunHttpRequest.cs @@ -12,10 +12,11 @@ internal class MailgunHttpRequest private readonly HttpWebRequest request; - public MailgunHttpRequest(IMailgunAccountInfo accountInfo, string method, string relativePath) + public MailgunHttpRequest(IMailgunAccountInfo accountInfo, string method, string relativePath, int timeout = 100000) { request = (HttpWebRequest)WebRequest.Create(new Uri(accountInfo.DomainBaseUrl, relativePath)); request.Method = method; + request.Timeout = timeout; // Note: ensure no preceding 401, request.PreAuthenticate does not work as you might expect request.Headers.Add("Authorization", "basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes($"api:{accountInfo.ApiKey}"))); From 52edb2404bfdadf622ee5ed2346051ba0579bb32 Mon Sep 17 00:00:00 2001 From: Adam Stiskala Date: Fri, 12 Jul 2019 13:00:30 +1000 Subject: [PATCH 2/2] Add support for a configurable HTTP timeout --- src/Typesafe.Mailgun/MailgunClient.cs | 20 ++++++++++++++++---- src/Typesafe.Mailgun/MailgunCommand`1.cs | 4 ++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/Typesafe.Mailgun/MailgunClient.cs b/src/Typesafe.Mailgun/MailgunClient.cs index 6a25fb9..a1f73c2 100644 --- a/src/Typesafe.Mailgun/MailgunClient.cs +++ b/src/Typesafe.Mailgun/MailgunClient.cs @@ -20,13 +20,25 @@ public MailgunClient(string domain, string apiKey, int version) ApiKey = apiKey; } + /// + /// Initializes a new client for the specified domain and api key with a timeout. + /// + public MailgunClient(string domain, string apiKey, int version, int timeout) + { + DomainBaseUrl = new Uri(string.Format("https://api.mailgun.net/v{0}/", version) + domain + "/"); + ApiKey = apiKey; + Timeout = timeout; + } + public Uri DomainBaseUrl { get; private set; } public string ApiKey { get; private set; } + public int Timeout { get; private set; } = 100000; + public SendMailCommandResult SendMail(MailMessage mailMessage) { - return new SendMailCommand(this, mailMessage).Invoke(); + return new SendMailCommand(this, mailMessage).Invoke(Timeout); } public SendMailCommandResult SendBatchMail(MailMessage mailMessage) @@ -36,7 +48,7 @@ public SendMailCommandResult SendBatchMail(MailMessage mailMessage) public SendMailCommandResult SendBatchMail(MailMessage mailMessage, IDictionary> recipientVariables) { - return new SendMailCommand(this, mailMessage, recipientVariables).Invoke(); + return new SendMailCommand(this, mailMessage, recipientVariables).Invoke(Timeout); } public IEnumerable GetRoutes(int skip, int take, out int count) @@ -46,12 +58,12 @@ public IEnumerable GetRoutes(int skip, int take, out int count) public Route CreateRoute(int priority, string description, RouteFilter expression, params RouteAction[] actions) { - return new CreateRouteCommand(this, priority, description, expression, actions).Invoke().Route; + return new CreateRouteCommand(this, priority, description, expression, actions).Invoke(Timeout).Route; } public CommandResult DeleteRoute(string routeId) { - return new DeleteCommand(this, "../routes/" + routeId).Invoke(); + return new DeleteCommand(this, "../routes/" + routeId).Invoke(Timeout); } public IEnumerable GetStats(int skip, int take, MailgunEventTypes eventTypes, out int count) diff --git a/src/Typesafe.Mailgun/MailgunCommand`1.cs b/src/Typesafe.Mailgun/MailgunCommand`1.cs index a4c4bfe..acbdbaa 100644 --- a/src/Typesafe.Mailgun/MailgunCommand`1.cs +++ b/src/Typesafe.Mailgun/MailgunCommand`1.cs @@ -21,9 +21,9 @@ protected MailgunCommand(IMailgunAccountInfo accountInfo, string path, string ht protected IMailgunAccountInfo AccountInfo { get; } - public T Invoke() + public T Invoke(int timeout) { - var request = new MailgunHttpRequest(AccountInfo, httpVerb, path); + var request = new MailgunHttpRequest(AccountInfo, httpVerb, path, timeout); request.SetFormParts(CreateFormParts());