diff --git a/Dockerfile b/Dockerfile index 955b2da..1635d3b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,6 +18,6 @@ FROM openjdk:8 EXPOSE 8080 WORKDIR /usr/src/app -COPY build/libs/ecs-browser-1.0.0rc1.jar ./ +COPY build/libs/ecs-browser-1.0.0rc2.jar ./ -CMD [ "java", "-jar", "ecs-browser-1.0.0rc1.jar" ] +CMD [ "java", "-jar", "ecs-browser-1.0.0rc2.jar" ] diff --git a/build.gradle b/build.gradle index b01a0bc..abf9943 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ description = "ECS browser website" group = 'com.emc.ecs' -version = '1.0.0rc1' +version = '1.0.0rc2' ext.licenseName = '' ext.licenseUrl = '' @@ -30,7 +30,7 @@ defaultTasks 'build' jar { baseName = 'ecs-browser' - version = '1.0.0rc1' + version = '1.0.0rc2' 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 5ef3669..f1c57a2 100644 --- a/src/main/java/com/emc/ecs/browser/spring/ServiceController.java +++ b/src/main/java/com/emc/ecs/browser/spring/ServiceController.java @@ -213,7 +213,15 @@ public ResponseEntity postProxy(HttpServletRequest request) throws Exception while ( objectsToDownload.isTruncated() ) { String marker = objectsToDownload.getNextMarker(); if ( ( marker == null ) || marker.isEmpty() ) { - marker = objectsToDownload.getObjects().get( objectsToDownload.getObjects().size() - 1 ).getKey(); + 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=" + marker; System.out.println("Another page after " + marker + " using " + newUrl ); @@ -233,6 +241,71 @@ 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"))) { + 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)); + 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=" + 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()); + } + } + } catch (HttpClientErrorException e) { + 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); diff --git a/src/main/resources/static/javascript/ecs-sdk.js b/src/main/resources/static/javascript/ecs-sdk.js index e8662d6..340add3 100644 --- a/src/main/resources/static/javascript/ecs-sdk.js +++ b/src/main/resources/static/javascript/ecs-sdk.js @@ -226,6 +226,7 @@ EcsS3.prototype.listBuckets = function( callback ) { EcsS3.prototype.listObjects = function( params, callback ) { var apiUrl = this.getBucketApiUrl( params.entry ); + var headers = this.getHeaders('GET'); var separatorChar = '?'; if ( isNonEmptyString( params.delimiter ) ) { apiUrl = apiUrl + separatorChar + 'delimiter=' + params.delimiter; @@ -238,9 +239,10 @@ EcsS3.prototype.listObjects = function( params, callback ) { if ( isNonEmptyString( params.extraQueryParameters ) ) { apiUrl = apiUrl + separatorChar + params.extraQueryParameters; separatorChar = '&'; + } else { + headers['X-Passthrough-Type'] = 'listAll'; } - var headers = this.getHeaders('GET'); - + $.ajax({ url: apiUrl, method: 'POST', headers: headers, success: function(data, textStatus, jqHXR) { handleData( data, callback, getEcsBody );