From 04291b9a114138b76d752f3d68a7b19662249784 Mon Sep 17 00:00:00 2001 From: Gonzalo Date: Thu, 17 Sep 2020 11:46:11 -0300 Subject: [PATCH 1/2] - Add Support for DeviceType: Angular - Send Cache Headers for Angular. --- .../java/com/genexus/ClientInformation.java | 6 +++ .../com/genexus/GXSmartCacheProvider.java | 2 +- .../main/java/com/genexus/GxRestService.java | 49 +++++++++++++++---- 3 files changed, 46 insertions(+), 11 deletions(-) diff --git a/common/src/main/java/com/genexus/ClientInformation.java b/common/src/main/java/com/genexus/ClientInformation.java index 0953dbc57..c0463f351 100644 --- a/common/src/main/java/com/genexus/ClientInformation.java +++ b/common/src/main/java/com/genexus/ClientInformation.java @@ -73,4 +73,10 @@ static public String getPlatformName() platformName = SpecificImplementation.Application.getModelContext().getHttpContext().getHeader("DevicePlatform"); return platformName; } + + public final class DeviceTypeEnum { + public static final int iOS = 0; + public static final int Android = 1; + public static final int Web = 4; + } } diff --git a/common/src/main/java/com/genexus/GXSmartCacheProvider.java b/common/src/main/java/com/genexus/GXSmartCacheProvider.java index 7592caafc..acbdc4e4a 100644 --- a/common/src/main/java/com/genexus/GXSmartCacheProvider.java +++ b/common/src/main/java/com/genexus/GXSmartCacheProvider.java @@ -61,7 +61,7 @@ public void discardUpdates() // // // Unknown/Invalid/UpToDate - static public DataUpdateStatus CheckDataStatus(String queryId, Date dateLastModified, Date[] dateUpdated_arr) + static public DataUpdateStatus checkDataStatus(String queryId, Date dateLastModified, Date[] dateUpdated_arr) { return (DataUpdateStatus) provider.CheckDataStatus(queryId, dateLastModified, dateUpdated_arr); } diff --git a/java/src/main/java/com/genexus/GxRestService.java b/java/src/main/java/com/genexus/GxRestService.java index 926ba7906..bfe5d7c23 100644 --- a/java/src/main/java/com/genexus/GxRestService.java +++ b/java/src/main/java/com/genexus/GxRestService.java @@ -249,41 +249,68 @@ public boolean processHeaders(String queryId, HttpServletRequest myServletReques { setTheme(theme); } - String etag = myServletRequest.getMethod().equalsIgnoreCase(POST) ? null : myServletRequest.getHeader("If-Modified-Since"); + String eTag = isPostRequest(myServletRequest) ? null : myServletRequest.getHeader("If-Modified-Since"); Date dt = Application.getStartDateTime(); Date newDt = new Date(); GXSmartCacheProvider.DataUpdateStatus status; Date[] newDt_arr = new Date[] { newDt }; - if (etag == null) + if (eTag == null) { status = GXSmartCacheProvider.DataUpdateStatus.Invalid; - GXSmartCacheProvider.CheckDataStatus(queryId, dt, newDt_arr); + GXSmartCacheProvider.checkDataStatus(queryId, dt, newDt_arr); } else { - dt = HTMLDateToDatetime(etag); - status = GXSmartCacheProvider.CheckDataStatus(queryId, dt, newDt_arr); + dt = HTMLDateToDatetime(eTag); + status = GXSmartCacheProvider.checkDataStatus(queryId, dt, newDt_arr); } newDt = newDt_arr[0]; - if (myServletResponse != null) // Temporary: Jersey Service called through AWS Lambda where HttpResponse is null. - myServletResponse.addHeader("Last-Modified", DateTimeToHTMLDate(newDt)); + addHeader(myServletResponse, "Last-Modified", DateTimeToHTMLDate(newDt)); + addCacheHeaders(myServletResponse); if (status == GXSmartCacheProvider.DataUpdateStatus.UpToDate) { return false; } return true; } - + + private void addCacheHeaders(HttpServletResponse myServletResponse) { + /* + * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control + * Specifying no-cache or max-age=0 indicates that + * clients can cache a resource and must revalidate each time before using it. + * This means HTTP request occurs each time, but it can skip downloading HTTP body if the content is valid. + */ + if (ClientInformation.getDeviceType() == ClientInformation.DeviceTypeEnum.Web) { + addHeader(myServletResponse, "Cache-Control", "no-cache, max-age=0"); + } + } + + boolean isPostRequest(HttpServletRequest request) + { + return request.getMethod().equalsIgnoreCase(POST); + } + + void addHeader(HttpServletResponse response, String headerName, String headerValue) + { + if (response != null) { + // Temporary: Jersey Service called through AWS Lambda where HttpResponse is null. + response.addHeader(headerName, headerValue); + } + else { + logger.warn("Could add HttpHeader to Response"); + } + } + Date HTMLDateToDatetime(String s) { - // Formato fecha: RFC 1123 + // Date Format: RFC 1123 try { SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", java.util.Locale.US); java.util.TimeZone tz = java.util.TimeZone.getTimeZone("GMT"); sdf.setTimeZone(tz); return sdf.parse(s); - } catch(ParseException p) { @@ -299,4 +326,6 @@ String DateTimeToHTMLDate(Date dt) sdf.setTimeZone(tz); return sdf.format(dt); } + + } \ No newline at end of file From 7e639311b484b01de29c3f5c931f7c7d19ea27e2 Mon Sep 17 00:00:00 2001 From: Gonzalo Date: Thu, 17 Sep 2020 14:17:20 -0300 Subject: [PATCH 2/2] Add Blackberry & Windows --- common/src/main/java/com/genexus/ClientInformation.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/src/main/java/com/genexus/ClientInformation.java b/common/src/main/java/com/genexus/ClientInformation.java index c0463f351..3abcc023c 100644 --- a/common/src/main/java/com/genexus/ClientInformation.java +++ b/common/src/main/java/com/genexus/ClientInformation.java @@ -77,6 +77,8 @@ static public String getPlatformName() public final class DeviceTypeEnum { public static final int iOS = 0; public static final int Android = 1; + public static final int Blackberry = 2; + public static final int Windows = 3; public static final int Web = 4; } }