From 62e021c63f909b8936c9403c114ea9163a0b3314 Mon Sep 17 00:00:00 2001 From: seibed Date: Fri, 4 Jan 2019 17:42:37 -0500 Subject: [PATCH 1/3] Refactoring to handle arbitrary size buckets properly. --- .../ecs/browser/spring/ServiceController.java | 231 ++++++++---------- 1 file changed, 101 insertions(+), 130 deletions(-) diff --git a/src/main/java/com/emc/ecs/browser/spring/ServiceController.java b/src/main/java/com/emc/ecs/browser/spring/ServiceController.java index 03e54b5..c6153a5 100644 --- a/src/main/java/com/emc/ecs/browser/spring/ServiceController.java +++ b/src/main/java/com/emc/ecs/browser/spring/ServiceController.java @@ -22,6 +22,7 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.URI; +import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -88,6 +89,11 @@ public ResponseEntity postProxy(HttpServletRequest request) throws Exception S3Config s3Config = getS3Config(request); HttpMethod method = getMethod(request); + String endpoint = request.getHeader("X-Passthrough-Endpoint"); + while (endpoint.endsWith("/")) { + endpoint = endpoint.substring(0, endpoint.length() - 1); + } + String resource = request.getRequestURI(); resource = resource.substring(resource.indexOf(PROXY_PATH) + PROXY_PATH.length()); if (!resource.startsWith("/")) { @@ -181,142 +187,56 @@ public ResponseEntity postProxy(HttpServletRequest request) throws Exception downloadFolder = "/usr/src/app/"; } - sign(method.toString(), resource, parameters, headers, s3Config); - - HttpHeaders newHeaders = new HttpHeaders(); - for (Entry> header : headers.entrySet()) { - List headerValue = new ArrayList(header.getValue().size()); - for (Object value : header.getValue()) { - headerValue.add((String) value); - } - newHeaders.put(header.getKey(), headerValue); - } - - String queryString = RestUtil.generateRawQueryString(parameters); - if (StringUtil.isNotBlank(queryString)) { - resource = resource + "?" + queryString; - } - String endpoint = request.getHeader("X-Passthrough-Endpoint"); - while (endpoint.endsWith("/")) { - endpoint = endpoint.substring(0, endpoint.length() - 1); - } - resource = endpoint + resource; - - RequestEntity requestEntity = new RequestEntity(data, newHeaders, method, new URI(resource)); + RequestEntity requestEntity = getRequestEntity( data, resource, parameters, headers, method, endpoint, s3Config ); RestTemplate client = new RestTemplate(); try { dataToReturn = new WrappedResponseEntity( client.exchange(requestEntity, ListObjectsResult.class) ); - if ( ((ResponseEntity) dataToReturn).getStatusCode().is2xxSuccessful() ) { - ListObjectsResult objectsToDownload = ((ResponseEntity) dataToReturn).getBody(); + ListObjectsResult objectsToDownload = ((ResponseEntity) dataToReturn).getBody(); + downloadObjects( downloadFolder, objectsToDownload.getBucketName(), objectsToDownload.getObjects(), s3Config ); + while ( objectsToDownload.isTruncated() ) { + parameters.put( "marker", getNextMarker( objectsToDownload ) ); + requestEntity = getRequestEntity( data, resource, parameters, headers, method, endpoint, s3Config ); + dataToReturn = new WrappedResponseEntity( client.exchange(requestEntity, ListObjectsResult.class) ); + objectsToDownload = ((ResponseEntity) dataToReturn).getBody(); downloadObjects( downloadFolder, objectsToDownload.getBucketName(), objectsToDownload.getObjects(), s3Config ); - String separator = resource.indexOf("?") < 0 ? "?" : "&"; - while ( objectsToDownload.isTruncated() ) { - String marker = objectsToDownload.getNextMarker(); - if ( ( marker == null ) || marker.isEmpty() ) { - String lastKey = ""; - if ( ( objectsToDownload.getObjects() != null ) && ( objectsToDownload.getObjects().size() > 0 ) ) { - lastKey = objectsToDownload.getObjects().get( objectsToDownload.getObjects().size() - 1 ).getKey(); - } - String lastPrefix = ""; - if ( ( objectsToDownload.getCommonPrefixes() != null ) && ( objectsToDownload.getCommonPrefixes().size() > 0 ) ) { - lastPrefix = objectsToDownload.getCommonPrefixes().get( objectsToDownload.getCommonPrefixes().size() - 1 ); - } - marker = ( lastPrefix.compareTo(lastKey) > 0 ) ? lastPrefix : lastKey; - } - String newUrl = resource + separator + "marker=" + RestUtil.urlEncode(marker); - System.out.println("Another page after " + marker + " using " + newUrl ); - requestEntity = new RequestEntity(data, newHeaders, method, new URI(newUrl)); - dataToReturn = new WrappedResponseEntity( client.exchange(requestEntity, ListObjectsResult.class) ); - if ( !((ResponseEntity) dataToReturn).getStatusCode().is2xxSuccessful() ) { - break; - } - objectsToDownload = ((ResponseEntity) dataToReturn).getBody(); - downloadObjects( downloadFolder, objectsToDownload.getBucketName(), objectsToDownload.getObjects(), s3Config ); - } } } catch (HttpClientErrorException e) { - dataToReturn = new ErrorData(e); // handle and display on the other end + if ( dataToReturn == null ) { + dataToReturn = new ErrorData(e); // handle and display on the other end + } e.printStackTrace(System.out); } catch (Exception e) { dataToReturn = new ErrorData(e); // handle and display on the other end e.printStackTrace(System.out); } } else if ("listAll".equals(request.getHeader("X-Passthrough-Type"))) { - sign(method.toString(), resource, parameters, headers, s3Config); - - HttpHeaders newHeaders = new HttpHeaders(); - for (Entry> header : headers.entrySet()) { - List headerValue = new ArrayList(header.getValue().size()); - for (Object value : header.getValue()) { - headerValue.add((String) value); - } - newHeaders.put(header.getKey(), headerValue); - } - - String queryString = RestUtil.generateRawQueryString(parameters); - if (StringUtil.isNotBlank(queryString)) { - resource = resource + "?" + queryString; - } - String endpoint = request.getHeader("X-Passthrough-Endpoint"); - while (endpoint.endsWith("/")) { - endpoint = endpoint.substring(0, endpoint.length() - 1); - } - resource = endpoint + resource; - - RequestEntity requestEntity = new RequestEntity(data, newHeaders, method, new URI(resource)); + RequestEntity requestEntity = getRequestEntity( data, resource, parameters, headers, method, endpoint, s3Config ); RestTemplate client = new RestTemplate(); try { ResponseEntity baseResponse = new WrappedResponseEntity( client.exchange(requestEntity, ListObjectsResult.class) ); dataToReturn = baseResponse; - if ( baseResponse.getStatusCode().is2xxSuccessful() ) { - ListObjectsResult listResult = baseResponse.getBody(); - String separator = resource.indexOf("?") < 0 ? "?" : "&"; - while ( listResult.isTruncated() ) { - String marker = listResult.getNextMarker(); - if ( ( marker == null ) || marker.isEmpty() ) { - String lastKey = ""; - if ( ( listResult.getObjects() != null ) && ( listResult.getObjects().size() > 0 ) ) { - lastKey = listResult.getObjects().get( listResult.getObjects().size() - 1 ).getKey(); - } - String lastPrefix = ""; - if ( ( listResult.getCommonPrefixes() != null ) && ( listResult.getCommonPrefixes().size() > 0 ) ) { - lastPrefix = listResult.getCommonPrefixes().get( listResult.getCommonPrefixes().size() - 1 ); - } - marker = ( lastPrefix.compareTo(lastKey) > 0 ) ? lastPrefix : lastKey; - } - String newUrl = resource + separator + "marker=" + RestUtil.urlEncode(marker); - System.out.println("Another page after " + marker + " using " + newUrl ); - requestEntity = new RequestEntity(data, newHeaders, method, new URI(newUrl)); - ResponseEntity newListResponse = new WrappedResponseEntity( client.exchange(requestEntity, ListObjectsResult.class) ); - if ( !newListResponse.getStatusCode().is2xxSuccessful() ) { - dataToReturn = newListResponse; - break; - } - ListObjectsResult newListResult = newListResponse.getBody(); - listResult.setTruncated(newListResult.isTruncated()); - listResult.setNextMarker(newListResult.getNextMarker()); - listResult.getObjects().addAll(newListResult.getObjects()); - listResult.getCommonPrefixes().addAll(newListResult.getCommonPrefixes()); - } + ListObjectsResult listResult = baseResponse.getBody(); + while ( listResult.isTruncated() ) { + parameters.put( "marker", getNextMarker( listResult ) ); + requestEntity = getRequestEntity( data, resource, parameters, headers, method, endpoint, s3Config ); + ResponseEntity newListResponse = new WrappedResponseEntity( client.exchange(requestEntity, ListObjectsResult.class) ); + ListObjectsResult newListResult = newListResponse.getBody(); + listResult.setTruncated( newListResult.isTruncated() ); + listResult.setNextMarker( getNextMarker( newListResult ) ); + listResult.getObjects().addAll( newListResult.getObjects() ); + listResult.getCommonPrefixes().addAll( newListResult.getCommonPrefixes() ); } } catch (HttpClientErrorException e) { - dataToReturn = new ErrorData(e); // handle and display on the other end + if ( dataToReturn == null ) { + dataToReturn = new ErrorData(e); // handle and display on the other end + } e.printStackTrace(System.out); } catch (Exception e) { dataToReturn = new ErrorData(e); // handle and display on the other end e.printStackTrace(System.out); } } else { - sign(method.toString(), resource, parameters, headers, s3Config); - - HttpHeaders newHeaders = new HttpHeaders(); - for (Entry> header : headers.entrySet()) { - List headerValue = new ArrayList(header.getValue().size()); - for (Object value : header.getValue()) { - headerValue.add((String) value); - } - newHeaders.put(header.getKey(), headerValue); - } + RequestEntity requestEntity = getRequestEntity( data, resource, parameters, headers, method, endpoint, s3Config ); Class responseClass = null; if (resource.length() <= 1) { // no bucket name exists @@ -346,17 +266,6 @@ public ResponseEntity postProxy(HttpServletRequest request) throws Exception } } - String queryString = RestUtil.generateRawQueryString(parameters); - if (StringUtil.isNotBlank(queryString)) { - resource = resource + "?" + queryString; - } - String endpoint = request.getHeader("X-Passthrough-Endpoint"); - while (endpoint.endsWith("/")) { - endpoint = endpoint.substring(0, endpoint.length() - 1); - } - resource = endpoint + resource; - - RequestEntity requestEntity = new RequestEntity(data, newHeaders, method, new URI(resource)); RestTemplate client = new RestTemplate(); try { dataToReturn = new WrappedResponseEntity( client.exchange(requestEntity, responseClass) ); @@ -367,13 +276,73 @@ public ResponseEntity postProxy(HttpServletRequest request) throws Exception return ResponseEntity.ok( dataToReturn ); } + /** + * @param data + * @param resource + * @param parameters + * @param headers + * @param method + * @param endpoint + * @param s3Config + * @return + * @throws Exception + */ + private static final RequestEntity getRequestEntity(byte[] data, String resource, Map parameters, + Map> headers, HttpMethod method, String endpoint, S3Config s3Config) throws Exception { + sign(method.toString(), resource, parameters, headers, s3Config); + + HttpHeaders newHeaders = new HttpHeaders(); + for (Entry> header : headers.entrySet()) { + List headerValue = new ArrayList(header.getValue().size()); + for (Object value : header.getValue()) { + headerValue.add((String) value); + } + newHeaders.put(header.getKey(), headerValue); + } + + String queryString = RestUtil.generateRawQueryString(parameters); + if (StringUtil.isNotBlank(queryString)) { + resource = resource + "?" + queryString; + } + resource = endpoint + resource; + + return new RequestEntity(data, newHeaders, method, new URI(resource)); + } + + /** + * @param objectList + * @return + */ + private static final String getNextMarker( ListObjectsResult objectList ) { + String marker = null; + + if ( objectList.isTruncated() ) { + marker = objectList.getNextMarker(); + if ( ( marker == null ) || marker.isEmpty() ) { + String lastKey = ""; + if ( ( objectList.getObjects() != null ) && ( objectList.getObjects().size() > 0 ) ) { + lastKey = objectList.getObjects().get( objectList.getObjects().size() - 1 ).getKey(); + } + String lastPrefix = ""; + if ( ( objectList.getCommonPrefixes() != null ) && ( objectList.getCommonPrefixes().size() > 0 ) ) { + lastPrefix = objectList.getCommonPrefixes().get( objectList.getCommonPrefixes().size() - 1 ); + } + marker = ( lastPrefix.compareTo(lastKey) > 0 ) ? lastPrefix : lastKey; + } + + System.out.println( "Fetching another page after " + marker ); + } + + return marker; + } + /** * @param downloadFolder * @param objects * @param s3Config * @throws Exception */ - private void downloadObjects(String downloadFolder, String bucketName, List objects, S3Config s3Config) throws Exception { + private static final void downloadObjects(String downloadFolder, String bucketName, List objects, S3Config s3Config) throws Exception { File downloadBucketParent = new File( downloadFolder ); File downloadBucket = new File( downloadBucketParent, bucketName ); if ( !downloadBucket.exists() ) { @@ -396,6 +365,8 @@ private void downloadObjects(String downloadFolder, String bucketName, List parameters, Map> headers) throws Exception { + private static final byte[] convertToXmlAsNeeded(byte[] data, Map parameters, Map> headers) throws Exception { Class outputClass = null; if (parameters.containsKey("acl")) { outputClass = AccessControlList.class; @@ -477,7 +448,7 @@ private byte[] convertToXmlAsNeeded(byte[] data, Map parameters, * @return * @throws Exception */ - private byte[] readBody(HttpServletRequest request) throws Exception { + private static final byte[] readBody(HttpServletRequest request) throws Exception { byte[] buffer = new byte[request.getContentLength()]; request.getInputStream().read(buffer); return buffer; @@ -490,7 +461,7 @@ private byte[] readBody(HttpServletRequest request) throws Exception { * @param headers * @param s3Config */ - private void sign(String method, String resource, Map parameters, Map> headers, + private static final void sign(String method, String resource, Map parameters, Map> headers, S3Config s3Config) { if (StringUtil.isBlank(s3Config.getSecretKey())) { // no auth secret; skip signing, e.g. for public read-only buckets. @@ -514,7 +485,7 @@ private static final HttpMethod getMethod(HttpServletRequest request) { * @param request * @return */ - private static String getMethodName(HttpServletRequest request) { + private static final String getMethodName(HttpServletRequest request) { return request.getHeader("X-Passthrough-Method"); } @@ -522,7 +493,7 @@ private static String getMethodName(HttpServletRequest request) { * @param list * @return */ - private Boolean isNotEmpty(List list) { + private static final Boolean isNotEmpty(List list) { return ((list != null) && (list.size() > 0)); } From 0625097e614f1c7c90e3786f8d3a285133d1a8e7 Mon Sep 17 00:00:00 2001 From: seibed Date: Mon, 7 Jan 2019 14:49:03 -0500 Subject: [PATCH 2/3] Refactored, updated version number. --- build.gradle | 4 +- .../ecs/browser/spring/ServiceController.java | 92 ++++++++++--------- .../resources/static/javascript/S3Browser.js | 2 +- 3 files changed, 50 insertions(+), 48 deletions(-) diff --git a/build.gradle b/build.gradle index 388b586..01e2d66 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ description = "ECS browser website" group = 'com.emc.ecs' -version = '1.0.1' +version = '1.0.2' ext.licenseName = '' ext.licenseUrl = '' @@ -30,7 +30,7 @@ defaultTasks 'build' jar { baseName = 'ecs-browser' - version = '1.0.1' + version = '1.0.2' into('META-INF/dependency-license') { from 'build/reports/dependency-license' } diff --git a/src/main/java/com/emc/ecs/browser/spring/ServiceController.java b/src/main/java/com/emc/ecs/browser/spring/ServiceController.java index c6153a5..704dbea 100644 --- a/src/main/java/com/emc/ecs/browser/spring/ServiceController.java +++ b/src/main/java/com/emc/ecs/browser/spring/ServiceController.java @@ -16,13 +16,8 @@ import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; -import java.io.OutputStreamWriter; import java.net.URI; -import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -41,7 +36,6 @@ import org.eclipse.jetty.util.StringUtil; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; @@ -84,22 +78,46 @@ public class ServiceController { private static final String PROXY_PATH = SERVLET_PATH + PROXY_SUBPATH; + private static final String SEPARATOR = "/"; + + private static final String DOUBLE_SEPARATOR = SEPARATOR + SEPARATOR; + + private static final String PASSTHROUGH_HEADER_START = "X-Passthrough-"; + + private static final String ENDPOINT_HEADER = PASSTHROUGH_HEADER_START + "Endpoint"; + + private static final String METHOD_HEADER = PASSTHROUGH_HEADER_START + "Method"; + + private static final String NAMESPACE_HEADER = PASSTHROUGH_HEADER_START + "Namespace"; + + private static final String KEY_HEADER = PASSTHROUGH_HEADER_START + "Key"; + + private static final String SECRET_HEADER = PASSTHROUGH_HEADER_START + "Secret"; + + private static final String TYPE_HEADER = PASSTHROUGH_HEADER_START + "Type"; + + private static final String EXPIRES_HEADER = PASSTHROUGH_HEADER_START + "Expires"; + + private static final String DOWNLOAD_FOLDER_HEADER = PASSTHROUGH_HEADER_START + "Download-Folder"; + + private static final String MARKER_PARAMETER = "marker"; + @RequestMapping(value = PROXY_SUBPATH + "/**", method = RequestMethod.POST, produces="*/*", consumes="*/*") public ResponseEntity postProxy(HttpServletRequest request) throws Exception { S3Config s3Config = getS3Config(request); - HttpMethod method = getMethod(request); + HttpMethod method = HttpMethod.valueOf(request.getHeader(METHOD_HEADER)); - String endpoint = request.getHeader("X-Passthrough-Endpoint"); - while (endpoint.endsWith("/")) { + String endpoint = request.getHeader(ENDPOINT_HEADER); + while (endpoint.endsWith(SEPARATOR)) { endpoint = endpoint.substring(0, endpoint.length() - 1); } String resource = request.getRequestURI(); resource = resource.substring(resource.indexOf(PROXY_PATH) + PROXY_PATH.length()); - if (!resource.startsWith("/")) { - resource = "/" + resource; + if (!resource.startsWith(SEPARATOR)) { + resource = SEPARATOR + resource; } else { - while (resource.startsWith("//")) { + while (resource.startsWith(DOUBLE_SEPARATOR)) { resource = resource.substring(1); } } @@ -113,7 +131,7 @@ public ResponseEntity postProxy(HttpServletRequest request) throws Exception String headerName = headerNames.nextElement(); if ("accept".equalsIgnoreCase(headerName)) { RestUtil.putSingle(headers, "Accept", "application/xml"); - } else if (!headerName.startsWith("X-Passthrough-")) { + } else if (!headerName.startsWith(PASSTHROUGH_HEADER_START)) { List headerValue = new ArrayList(); Enumeration headerValues = request.getHeaders(headerName); while (headerValues.hasMoreElements()) { @@ -157,12 +175,12 @@ public ResponseEntity postProxy(HttpServletRequest request) throws Exception RestUtil.putSingle(headers, "Content-Length", Integer.toString(dataLength)); Object dataToReturn = null; - if ("presign".equals(request.getHeader("X-Passthrough-Type"))) { - while (resource.startsWith( "/" ) ) { + if ("presign".equals(request.getHeader(TYPE_HEADER))) { + while (resource.startsWith( SEPARATOR ) ) { resource = resource.substring(1); } - int delimiterIndex = resource.indexOf( "/" ); + int delimiterIndex = resource.indexOf( SEPARATOR ); String bucketName = null; String key = null; if ( delimiterIndex < 0 ) { @@ -175,14 +193,14 @@ public ResponseEntity postProxy(HttpServletRequest request) throws Exception } Date expirationTime = new Date(); - expirationTime.setTime(Long.parseLong(request.getHeader("X-Passthrough-Expires"))); - PresignedUrlRequest presignedUrlRequest = new PresignedUrlRequest(Method.valueOf(getMethodName(request)), bucketName, key, expirationTime); + expirationTime.setTime(Long.parseLong(request.getHeader(EXPIRES_HEADER))); + PresignedUrlRequest presignedUrlRequest = new PresignedUrlRequest(Method.valueOf(request.getHeader(METHOD_HEADER)), bucketName, key, expirationTime); presignedUrlRequest.setVersionId(parameters.get("versionId")); presignedUrlRequest.setNamespace(s3Config.getNamespace()); S3SignerV2 s3Signer = new S3SignerV2(s3Config); dataToReturn = s3Signer.generatePresignedUrl(presignedUrlRequest).toString(); - } else if ("download".equals(request.getHeader("X-Passthrough-Type"))) { - String downloadFolder = request.getHeader("X-Passthrough-Download-Folder"); + } else if ("download".equals(request.getHeader(TYPE_HEADER))) { + String downloadFolder = request.getHeader(DOWNLOAD_FOLDER_HEADER); if (StringUtil.isBlank(downloadFolder)) { downloadFolder = "/usr/src/app/"; } @@ -194,7 +212,7 @@ public ResponseEntity postProxy(HttpServletRequest request) throws Exception ListObjectsResult objectsToDownload = ((ResponseEntity) dataToReturn).getBody(); downloadObjects( downloadFolder, objectsToDownload.getBucketName(), objectsToDownload.getObjects(), s3Config ); while ( objectsToDownload.isTruncated() ) { - parameters.put( "marker", getNextMarker( objectsToDownload ) ); + parameters.put( MARKER_PARAMETER, getNextMarker( objectsToDownload ) ); requestEntity = getRequestEntity( data, resource, parameters, headers, method, endpoint, s3Config ); dataToReturn = new WrappedResponseEntity( client.exchange(requestEntity, ListObjectsResult.class) ); objectsToDownload = ((ResponseEntity) dataToReturn).getBody(); @@ -209,7 +227,7 @@ public ResponseEntity postProxy(HttpServletRequest request) throws Exception dataToReturn = new ErrorData(e); // handle and display on the other end e.printStackTrace(System.out); } - } else if ("listAll".equals(request.getHeader("X-Passthrough-Type"))) { + } else if ("listAll".equals(request.getHeader(TYPE_HEADER))) { RequestEntity requestEntity = getRequestEntity( data, resource, parameters, headers, method, endpoint, s3Config ); RestTemplate client = new RestTemplate(); try { @@ -217,7 +235,7 @@ public ResponseEntity postProxy(HttpServletRequest request) throws Exception dataToReturn = baseResponse; ListObjectsResult listResult = baseResponse.getBody(); while ( listResult.isTruncated() ) { - parameters.put( "marker", getNextMarker( listResult ) ); + parameters.put( MARKER_PARAMETER, getNextMarker( listResult ) ); requestEntity = getRequestEntity( data, resource, parameters, headers, method, endpoint, s3Config ); ResponseEntity newListResponse = new WrappedResponseEntity( client.exchange(requestEntity, ListObjectsResult.class) ); ListObjectsResult newListResult = newListResponse.getBody(); @@ -255,7 +273,7 @@ public ResponseEntity postProxy(HttpServletRequest request) throws Exception } else if (parameters.containsKey("versions")) { responseClass = ListVersionsResult.class; } else { - int firstSlash = resource.indexOf('/', 2); + int firstSlash = resource.indexOf(SEPARATOR, 2); if (firstSlash < 0) { // no object name exists responseClass = ListObjectsResult.class; } else if (copySource) { @@ -377,11 +395,11 @@ private static final void downloadObjects(String downloadFolder, String bucketNa * @throws Exception */ private static final S3Config getS3Config(HttpServletRequest request) throws Exception { - String passthroughNamespace = request.getHeader("X-Passthrough-Namespace"); - String passthroughEndpoint = request.getHeader("X-Passthrough-Endpoint"); - String passthroughAccessKey = request.getHeader("X-Passthrough-Key"); - String passthroughSecretKey = request.getHeader("X-Passthrough-Secret"); - while (passthroughEndpoint.endsWith("/")) { + String passthroughNamespace = request.getHeader(NAMESPACE_HEADER); + String passthroughEndpoint = request.getHeader(ENDPOINT_HEADER); + String passthroughAccessKey = request.getHeader(KEY_HEADER); + String passthroughSecretKey = request.getHeader(SECRET_HEADER); + while (passthroughEndpoint.endsWith(SEPARATOR)) { passthroughEndpoint = passthroughEndpoint.substring(0, passthroughEndpoint.length() - 1); } S3Config s3Config = new S3Config(new URI(passthroughEndpoint)); @@ -473,22 +491,6 @@ private static final void sign(String method, String resource, Map Date: Mon, 7 Jan 2019 14:53:58 -0500 Subject: [PATCH 3/3] Updated copyrights. --- gradle/wrapper/gradle-wrapper.properties | 2 +- src/main/java/com/emc/ecs/browser/spring/Application.java | 2 +- .../java/com/emc/ecs/browser/spring/ServiceController.java | 2 +- src/main/java/com/emc/ecs/browser/spring/ServiceFilter.java | 2 +- .../java/com/emc/ecs/browser/spring/StaticController.java | 2 +- .../java/com/emc/ecs/browser/spring/WebConfiguration.java | 2 +- .../com/emc/ecs/browser/spring/WrappedResponseEntity.java | 2 +- .../com/emc/object/s3/bean/ConcreteAccessControlList.java | 2 +- src/main/java/com/emc/object/s3/bean/ConcreteGrant.java | 2 +- src/main/java/com/emc/object/s3/bean/ConcreteGrantee.java | 2 +- .../java/com/emc/object/s3/bean/SlimCopyObjectResult.java | 2 +- src/main/resources/static/index.html | 4 ++-- src/main/resources/static/javascript/AclPage.js | 2 +- src/main/resources/static/javascript/BucketCreationPage.js | 2 +- src/main/resources/static/javascript/ConfigPage.js | 2 +- src/main/resources/static/javascript/ContextMenu.js | 2 +- src/main/resources/static/javascript/DirectoryPage.js | 2 +- src/main/resources/static/javascript/FileRow.js | 2 +- src/main/resources/static/javascript/MetadataSearchPage.js | 2 +- src/main/resources/static/javascript/ModalWindow.js | 2 +- src/main/resources/static/javascript/ObjectInfoPage.js | 2 +- src/main/resources/static/javascript/PropertiesPage.js | 2 +- src/main/resources/static/javascript/S3Browser.js | 2 +- src/main/resources/static/javascript/S3BrowserUtil.js | 2 +- src/main/resources/static/javascript/S3Template.js | 2 +- src/main/resources/static/javascript/S3TemplateEngine.js | 2 +- src/main/resources/static/javascript/SharePage.js | 2 +- src/main/resources/static/javascript/VersioningPage.js | 2 +- src/main/resources/static/javascript/VersionsAll.js | 2 +- src/main/resources/static/javascript/VersionsPage.js | 2 +- src/main/resources/static/javascript/ecs-sdk.js | 2 +- src/main/resources/static/raw.html | 2 +- src/main/resources/templates/index.tmpl | 4 ++-- 33 files changed, 35 insertions(+), 35 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c1db481..18ebbe1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,4 +1,4 @@ -# Copyright 2017-2018 Dell Inc. or its subsidiaries. All rights reserved. +# Copyright 2017-2019 Dell Inc. or its subsidiaries. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/main/java/com/emc/ecs/browser/spring/Application.java b/src/main/java/com/emc/ecs/browser/spring/Application.java index 847f514..afca09f 100644 --- a/src/main/java/com/emc/ecs/browser/spring/Application.java +++ b/src/main/java/com/emc/ecs/browser/spring/Application.java @@ -1,5 +1,5 @@ /** - * Copyright 2017-2018 Dell Inc. or its subsidiaries. All rights reserved. + * Copyright 2017-2019 Dell Inc. or its subsidiaries. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. diff --git a/src/main/java/com/emc/ecs/browser/spring/ServiceController.java b/src/main/java/com/emc/ecs/browser/spring/ServiceController.java index 704dbea..e76cea4 100644 --- a/src/main/java/com/emc/ecs/browser/spring/ServiceController.java +++ b/src/main/java/com/emc/ecs/browser/spring/ServiceController.java @@ -1,5 +1,5 @@ /** - * Copyright 2017-2018 Dell Inc. or its subsidiaries. All rights reserved. + * Copyright 2017-2019 Dell Inc. or its subsidiaries. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. diff --git a/src/main/java/com/emc/ecs/browser/spring/ServiceFilter.java b/src/main/java/com/emc/ecs/browser/spring/ServiceFilter.java index 89566d2..da57a02 100644 --- a/src/main/java/com/emc/ecs/browser/spring/ServiceFilter.java +++ b/src/main/java/com/emc/ecs/browser/spring/ServiceFilter.java @@ -1,5 +1,5 @@ /** - * Copyright 2016-2018 Dell Inc. or its subsidiaries. All rights reserved. + * Copyright 2016-2019 Dell Inc. or its subsidiaries. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. diff --git a/src/main/java/com/emc/ecs/browser/spring/StaticController.java b/src/main/java/com/emc/ecs/browser/spring/StaticController.java index 667e0eb..53febb0 100644 --- a/src/main/java/com/emc/ecs/browser/spring/StaticController.java +++ b/src/main/java/com/emc/ecs/browser/spring/StaticController.java @@ -1,5 +1,5 @@ /** - * Copyright 2017-2018 Dell Inc. or its subsidiaries. All rights reserved. + * Copyright 2017-2019 Dell Inc. or its subsidiaries. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. diff --git a/src/main/java/com/emc/ecs/browser/spring/WebConfiguration.java b/src/main/java/com/emc/ecs/browser/spring/WebConfiguration.java index 0840f3e..711075a 100644 --- a/src/main/java/com/emc/ecs/browser/spring/WebConfiguration.java +++ b/src/main/java/com/emc/ecs/browser/spring/WebConfiguration.java @@ -1,5 +1,5 @@ /** - * Copyright 2017-2018 Dell Inc. or its subsidiaries. All rights reserved. + * Copyright 2017-2019 Dell Inc. or its subsidiaries. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. diff --git a/src/main/java/com/emc/ecs/browser/spring/WrappedResponseEntity.java b/src/main/java/com/emc/ecs/browser/spring/WrappedResponseEntity.java index ebffdc2..4d415cd 100644 --- a/src/main/java/com/emc/ecs/browser/spring/WrappedResponseEntity.java +++ b/src/main/java/com/emc/ecs/browser/spring/WrappedResponseEntity.java @@ -1,5 +1,5 @@ /** - * Copyright 2017-2018 Dell Inc. or its subsidiaries. All rights reserved. + * Copyright 2017-2019 Dell Inc. or its subsidiaries. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. diff --git a/src/main/java/com/emc/object/s3/bean/ConcreteAccessControlList.java b/src/main/java/com/emc/object/s3/bean/ConcreteAccessControlList.java index 593f636..77c4056 100644 --- a/src/main/java/com/emc/object/s3/bean/ConcreteAccessControlList.java +++ b/src/main/java/com/emc/object/s3/bean/ConcreteAccessControlList.java @@ -1,5 +1,5 @@ /** - * Copyright 2018 Dell Inc. or its subsidiaries. All rights reserved. + * Copyright 2018-2019 Dell Inc. or its subsidiaries. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. diff --git a/src/main/java/com/emc/object/s3/bean/ConcreteGrant.java b/src/main/java/com/emc/object/s3/bean/ConcreteGrant.java index 18f9558..6790ca8 100644 --- a/src/main/java/com/emc/object/s3/bean/ConcreteGrant.java +++ b/src/main/java/com/emc/object/s3/bean/ConcreteGrant.java @@ -1,5 +1,5 @@ /** - * Copyright 2018 Dell Inc. or its subsidiaries. All rights reserved. + * Copyright 2018-2019 Dell Inc. or its subsidiaries. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. diff --git a/src/main/java/com/emc/object/s3/bean/ConcreteGrantee.java b/src/main/java/com/emc/object/s3/bean/ConcreteGrantee.java index 5f92f05..7e7e569 100644 --- a/src/main/java/com/emc/object/s3/bean/ConcreteGrantee.java +++ b/src/main/java/com/emc/object/s3/bean/ConcreteGrantee.java @@ -1,5 +1,5 @@ /** - * Copyright 2018 Dell Inc. or its subsidiaries. All rights reserved. + * Copyright 2018-2019 Dell Inc. or its subsidiaries. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. diff --git a/src/main/java/com/emc/object/s3/bean/SlimCopyObjectResult.java b/src/main/java/com/emc/object/s3/bean/SlimCopyObjectResult.java index 6494572..db0aee8 100644 --- a/src/main/java/com/emc/object/s3/bean/SlimCopyObjectResult.java +++ b/src/main/java/com/emc/object/s3/bean/SlimCopyObjectResult.java @@ -1,5 +1,5 @@ /** - * Copyright 2017-2018 Dell Inc. or its subsidiaries. All rights reserved. + * Copyright 2017-2019 Dell Inc. or its subsidiaries. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html index a875a7e..de8fb84 100644 --- a/src/main/resources/static/index.html +++ b/src/main/resources/static/index.html @@ -1,6 +1,6 @@