public void ProcessRequest(HttpContext context) { if (dataSummaryManager == null) dataSummaryManager = new DataSummaryManager(); APIRequestParams filterSettings = new APIRequestParams(); filterSettings.ParseParameters(filterSettings,context); string action = "totals_per_country"; if (!String.IsNullOrEmpty(context.Request["action"])) { action = context.Request["action"].ToString(); } if (action == "totals_per_country") { context.Response.ContentType = "application/javascript"; context.Response.Write(dataSummaryManager.GetTotalsPerCountrySummary(true,"ocm_getdatasummary", filterSettings )); context.Response.Flush(); } if (action == "full_summary") { // Output JSON summary of: // - Current totals per country // - Total added (per country? based on date range, location/distance filter?) // - Total modified // - User Comments Count // - per month values, current month first? default last 12 months } if (action == "activity_summary") { // Based on date range, location and distance: // - list of recent comments, checkins, id & title etc of items added & modified var o = new JSONOutputProvider(); context.Response.ContentType = o.ContentType; var summary = dataSummaryManager.GetActivitySummary(filterSettings); o.PerformSerialisationV2(context.Response.OutputStream, summary, filterSettings.Callback); context.Response.Flush(); } }
/// <summary> /// Output compact (id's only for reference data) POI list /// </summary> /// <param name="context"></param> /// <param name="filter"></param> private void OutputCompactPOIList(HttpContext context, APIRequestParams filter) { //get list of charge points as compact POISearchResult List for output: List<OCM.API.Common.Model.ChargePoint> dataList = new POIManager().GetChargePoints(filter); int numResults = dataList.Count; List<POISearchResult> poiList = new List<POISearchResult>(); foreach (var c in dataList) { var poi = new POISearchResult { ID = c.ID, Title = c.AddressInfo.Title, Address = c.AddressInfo.AddressLine1, Distance = c.AddressInfo.Distance, Latitude = (double)c.AddressInfo.Latitude, Longitude = (double)c.AddressInfo.Longitude, Postcode = c.AddressInfo.Postcode, UsageTypeID = c.UsageType != null ? c.UsageType.ID : 0, StatusTypeID = c.StatusType != null ? c.StatusType.ID : 0 }; poiList.Add(poi); } var o = new JSONOutputProvider(); string description = "Compact POI List: id=ID, t= Title, u= UsageTypeID, s= StatusTypeID, a=Address, p=Postcode, lt=Latitude, lg=Longitude, d= Distance"; o.PerformSerialisationV2(context.Response.OutputStream, new { status = "OK", description = description, count = poiList.Count, results = poiList }, filter.Callback); }
/// <summary> /// Handle output from API /// </summary> /// <param name="context"></param> private async void PerformOutput(HttpContext context) { HttpContext.Current.Server.ScriptTimeout = 120; //max script execution time is 2 minutes System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch(); stopwatch.Start(); //decide correct reponse type IOutputProvider outputProvider = null; var filter = new APIRequestParams(); //set defaults string outputType = "xml"; filter.DistanceUnit = DistanceUnit.Miles; filter.MaxResults = 100; filter.EnableCaching = true; filter.ParseParameters(context); //override ?v=2 etc if called via /api/v2/ or /api/v1 if (APIBehaviourVersion > 0) filter.APIVersion = APIBehaviourVersion; if (APIBehaviourVersion >= 2) filter.Action = DefaultAction; if (context.Request.Url.Host.ToLower().StartsWith("api") && filter.APIVersion == null) { //API version is mandatory for api V2 onwards via api.openchargemap.* hostname OutputBadRequestMessage(context, "mandatory API Version not specified in request"); return; } if (!String.IsNullOrEmpty(context.Request["output"])) { outputType = ParseString(context.Request["output"]); } else { //new default after API V2 is json instead of XML if (filter.APIVersion >= 2) { outputType = "json"; } } //change defaults and override settings for deprecated api features if (filter.APIVersion >= 2) { //the following output types are deprecated and will default as JSON if (outputType == "carwings" || outputType == "rss") { OutputBadRequestMessage(context, "specified output type not supported in this API version"); return; } } if (IsRequestByRobot) { OutputBadRequestMessage(context, "API requests by robots are temporarily disabled.", statusCode: 503); return; } //determine output provider switch (outputType) { case "xml": outputProvider = new XMLOutputProvider(); break; case "carwings": case "rss": outputProvider = new RSSOutputProvider(); if (outputType == "carwings") ((RSSOutputProvider)outputProvider).EnableCarwingsMode = true; break; case "json": outputProvider = new JSONOutputProvider(); break; case "geojson": outputProvider = new GeoJSONOutputProvider(); break; case "csv": outputProvider = new CSVOutputProvider(); break; case "kml": outputProvider = new KMLOutputProvider(KMLOutputProvider.KMLVersion.V2); break; case "png": outputProvider = new ImageOutputProvider(); break; default: outputProvider = new XMLOutputProvider(); break; } if (outputProvider != null) { context.Response.ContentEncoding = Encoding.Default; context.Response.ContentType = outputProvider.ContentType; if (!(filter.Action == "getcorereferencedata" && String.IsNullOrEmpty(context.Request["SessionToken"]))) { //by default output is cacheable for 24 hrs, unless requested by a specific user. context.Response.Cache.SetExpires(DateTime.Now.AddDays(1)); context.Response.Cache.SetCacheability(HttpCacheability.Public); context.Response.Cache.SetValidUntilExpires(true); } if (ConfigurationManager.AppSettings["EnableOutputCompression"] == "true") { //apply compression if accepted string encodings = context.Request.Headers.Get("Accept-Encoding"); if (encodings != null) { encodings = encodings.ToLower(); if (encodings.ToLower().Contains("gzip")) { context.Response.Filter = new GZipStream(context.Response.Filter, CompressionLevel.Optimal, false); context.Response.AppendHeader("Content-Encoding", "gzip"); //context.Trace.Warn("GZIP Compression on"); } else { context.Response.Filter = new DeflateStream(context.Response.Filter, CompressionMode.Compress); context.Response.AppendHeader("Content-Encoding", "deflate"); //context.Trace.Warn("Deflate Compression on"); } } } if (filter.Action == "getchargepoints" || filter.Action == "getpoilist") { OutputPOIList(outputProvider, context, filter); } if (filter.Action == "getcompactpoilist") { //experimental:: OutputCompactPOIList(context, filter); } if (filter.Action == "getcorereferencedata") { OutputCoreReferenceData(outputProvider, context, filter); } if (filter.Action == "geocode") { this.OutputGeocodingResult(outputProvider, context, filter); } if (filter.Action == "availability") { this.OutputAvailabilityResult(outputProvider, context, filter); } if (filter.Action == "refreshmirror") { try { var itemsUpdated = await OCM.Core.Data.CacheManager.RefreshCachedData(); new JSONOutputProvider().GetOutput(context.Response.OutputStream, new { POICount = itemsUpdated, Status = "OK" }, filter); } catch (Exception exp) { new JSONOutputProvider().GetOutput(context.Response.OutputStream, new { Status = "Error", Message = exp.ToString() }, filter); } } stopwatch.Stop(); System.Diagnostics.Debug.WriteLine("Total output time: " + stopwatch.Elapsed.ToString()); } }