Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Get User Agent Summary from within an Azure Function using whatismybrowser.com API
#r "Newtonsoft.Json"
using System.Net;
using System.Net.Http;
using System.Text;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public static async Task<string> GetUserAgentSummaryAsync(HttpRequest req, TraceWriter log)
{
const bool verbose = false;
var agents = req.Headers["User-Agent"];
if (verbose) log.Info($"AGENTS COUNT = {agents.Count}");
if (verbose) log.Info($"{agents}");
var agentjson = $"{{ \"user_agent\": \"{agents[0]}\" }}";
if (verbose) log.Info($"AGENT JSON = [{agentjson}]");
const string useragent_apikey_header = "X-API-KEY";
const string useragent_apikey_location = "HOSTHEADER_APIKEY";
var useragent_apikey = System.Environment.GetEnvironmentVariable(useragent_apikey_location); // CONFIGURE IN YOUR ENVIRONMENT
if (verbose) log.Info($"API KEY LENGTH = {useragent_apikey.Length}");
const string useragent_apiurl = "https://api.whatismybrowser.com/api/v2/user_agent_parse";
using (var httpClient = new HttpClient()) // okay for low-scale; else see https://docs.microsoft.com/en-us/azure/architecture/antipatterns/improper-instantiation/
{
var request = new HttpRequestMessage()
{
RequestUri = new Uri(useragent_apiurl),
Method = HttpMethod.Post,
Content = new StringContent(agentjson, Encoding.UTF8, "application/json")
};
request.Headers.Add(useragent_apikey_header, useragent_apikey);
// not needed, not harmful: request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
using (HttpResponseMessage response = await httpClient.SendAsync(request))
{
response.EnsureSuccessStatusCode(); // may throw
var result = await response.Content.ReadAsStringAsync();
if (verbose) log.Info($"RESULT = {result}");
if (verbose) log.Info($"AGENTS = {agents}");
var json = JObject.Parse(result);
bool parsedOk = ((string) (json["result"]["code"])) == "success";
bool is_abusive = (bool) (json["parse"]["is_abusive"]);
if (is_abusive || ! parsedOk)
{
throw new Exception($"Could not parse user agent ({parsedOk}) or was malformed ({is_abusive})");
}
var browser = (string) json["parse"]["software_name"];
var os = (string) json["parse"]["operating_system_name"];
var text = $"{browser} on {os}";
if (verbose) text = $"{text} [details: {result}]";
return text;
}
}
}
public static async Task<IActionResult> Run(HttpRequest req, TraceWriter log)
{
log.Info("Detect and return summary user agent for caller of this Azure Function");
string summaryUserAgent;
try
{
summaryUserAgent = await GetUserAgentSummaryAsync(req, log);
return (ActionResult) new OkObjectResult(summaryUserAgent);
}
catch (Exception ex)
{
return new BadRequestObjectResult(ex.Message);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.