Return-Path: X-Original-To: apmail-geode-commits-archive@minotaur.apache.org Delivered-To: apmail-geode-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 3A76318F59 for ; Mon, 9 Nov 2015 21:37:30 +0000 (UTC) Received: (qmail 88709 invoked by uid 500); 9 Nov 2015 21:37:30 -0000 Delivered-To: apmail-geode-commits-archive@geode.apache.org Received: (qmail 88676 invoked by uid 500); 9 Nov 2015 21:37:30 -0000 Mailing-List: contact commits-help@geode.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@geode.incubator.apache.org Delivered-To: mailing list commits@geode.incubator.apache.org Received: (qmail 88664 invoked by uid 99); 9 Nov 2015 21:37:30 -0000 Received: from Unknown (HELO spamd2-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 09 Nov 2015 21:37:30 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd2-us-west.apache.org (ASF Mail Server at spamd2-us-west.apache.org) with ESMTP id 944621A0A1F for ; Mon, 9 Nov 2015 21:37:29 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd2-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 0.771 X-Spam-Level: X-Spam-Status: No, score=0.771 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, T_RP_MATCHES_RCVD=-0.01, URIBL_BLOCKED=0.001] autolearn=disabled Received: from mx1-eu-west.apache.org ([10.40.0.8]) by localhost (spamd2-us-west.apache.org [10.40.0.9]) (amavisd-new, port 10024) with ESMTP id iIrbwjpP3E0P for ; Mon, 9 Nov 2015 21:37:18 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-eu-west.apache.org (ASF Mail Server at mx1-eu-west.apache.org) with SMTP id DEFC625417 for ; Mon, 9 Nov 2015 21:36:53 +0000 (UTC) Received: (qmail 77785 invoked by uid 99); 9 Nov 2015 21:36:53 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 09 Nov 2015 21:36:53 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id E3128E0A99; Mon, 9 Nov 2015 21:36:52 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: ashvin@apache.org To: commits@geode.incubator.apache.org Date: Mon, 09 Nov 2015 21:37:01 -0000 Message-Id: <5b8d5c9e4db04fb99b9a8c1825d2eee7@git.apache.org> In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [10/50] [abbrv] incubator-geode git commit: GEODE-381 enable gfsh https usage through SSL terminated environments GEODE-381 enable gfsh https usage through SSL terminated environments Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/e9aa18bd Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/e9aa18bd Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/e9aa18bd Branch: refs/heads/feature/GEODE-11 Commit: e9aa18bdbd8426d0d8dbede7e9ad68933f378be4 Parents: 8f96cf7 Author: Jens Deppe Authored: Mon Oct 5 15:01:17 2015 -0700 Committer: Jens Deppe Committed: Fri Oct 30 09:17:14 2015 -0700 ---------------------------------------------------------------------- .../internal/cli/commands/ShellCommands.java | 7 +- .../controllers/AbstractCommandsController.java | 7 +- .../controllers/ShellCommandsController.java | 178 ++++++++++--------- gemfire-web/build.gradle | 4 +- .../ShellCommandsControllerJUnitTest.java | 47 +++-- 5 files changed, 140 insertions(+), 103 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e9aa18bd/gemfire-core/src/main/java/com/gemstone/gemfire/management/internal/cli/commands/ShellCommands.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/management/internal/cli/commands/ShellCommands.java b/gemfire-core/src/main/java/com/gemstone/gemfire/management/internal/cli/commands/ShellCommands.java index 43e85f4..edab207 100644 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/management/internal/cli/commands/ShellCommands.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/management/internal/cli/commands/ShellCommands.java @@ -206,10 +206,13 @@ public class ShellCommands implements CommandMarker { url = url.replace("http:", "https:"); } } - + + // This is so that SSL termination results in https URLs being returned + String query = (url.startsWith("https")) ? "?scheme=https" : ""; + LogWrapper.getInstance().warning(String.format("Sending HTTP request for Link Index at (%1$s)...", url.concat("/index"))); - LinkIndex linkIndex = new SimpleHttpRequester(CONNECT_LOCATOR_TIMEOUT_MS).get(url.concat("/index"), LinkIndex.class); + LinkIndex linkIndex = new SimpleHttpRequester(CONNECT_LOCATOR_TIMEOUT_MS).get(url.concat("/index").concat(query), LinkIndex.class); LogWrapper.getInstance().warning(String.format("Received Link Index (%1$s)", linkIndex.toString())); http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e9aa18bd/gemfire-core/src/main/java/com/gemstone/gemfire/management/internal/web/controllers/AbstractCommandsController.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/management/internal/web/controllers/AbstractCommandsController.java b/gemfire-core/src/main/java/com/gemstone/gemfire/management/internal/web/controllers/AbstractCommandsController.java index 74a9bff..41a890a 100644 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/management/internal/web/controllers/AbstractCommandsController.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/management/internal/web/controllers/AbstractCommandsController.java @@ -57,6 +57,7 @@ import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.context.request.WebRequest; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; +import org.springframework.web.util.UriComponentsBuilder; /** * The AbstractCommandsController class is the abstract base class encapsulating common functionality across all @@ -255,12 +256,14 @@ public abstract class AbstractCommandsController { * Converts the URI relative path to an absolute path based on the Servlet context information. * * @param path the URI relative path to append to the Servlet context path. + * @param scheme the scheme to use for the URI * @return a URI constructed with all component path information. * @see java.net.URI * @see org.springframework.web.servlet.support.ServletUriComponentsBuilder */ - protected /*static*/ URI toUri(final String path) { - return ServletUriComponentsBuilder.fromCurrentContextPath().path(REST_API_VERSION).path(path).build().toUri(); + protected /*static*/ URI toUri(final String path, final String scheme) { + return ServletUriComponentsBuilder.fromCurrentContextPath() + .path(REST_API_VERSION).path(path).scheme(scheme).build().toUri(); } /** http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e9aa18bd/gemfire-core/src/main/java/com/gemstone/gemfire/management/internal/web/controllers/ShellCommandsController.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/management/internal/web/controllers/ShellCommandsController.java b/gemfire-core/src/main/java/com/gemstone/gemfire/management/internal/web/controllers/ShellCommandsController.java index bf3fb06..0bac797 100644 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/management/internal/web/controllers/ShellCommandsController.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/management/internal/web/controllers/ShellCommandsController.java @@ -144,7 +144,7 @@ public class ShellCommandsController extends AbstractCommandsController { * * @return a LinkIndex containing Links for all web service endpoints, REST API calls in GemFire. * @see com.gemstone.gemfire.management.internal.cli.i18n.CliStrings - * @see com.gemstone.gemfire.management.internal.web.controllers.AbstractCommandsController#toUri(String) + * @see AbstractCommandsController#toUri(String, String) * @see com.gemstone.gemfire.management.internal.web.domain.Link * @see com.gemstone.gemfire.management.internal.web.domain.LinkIndex * @see com.gemstone.gemfire.management.internal.web.http.HttpMethod @@ -153,113 +153,117 @@ public class ShellCommandsController extends AbstractCommandsController { // the Spring Web MVC Controller RequestMapping Annotations. @RequestMapping(method = RequestMethod.GET, value = "/index", produces = MediaType.APPLICATION_XML_VALUE) @ResponseBody - public LinkIndex index() { + public LinkIndex index(@RequestParam(value = "scheme", required = false, defaultValue = "http") final String scheme) { //logger.warning(String.format("Returning Link Index for Context Path (%1$s).", // ServletUriComponentsBuilder.fromCurrentContextPath().build().toString())); return new LinkIndex() // Cluster Commands - .add(new Link(CliStrings.STATUS_SHARED_CONFIG, toUri("/services/cluster-config"))) + .add(new Link(CliStrings.STATUS_SHARED_CONFIG, toUri("/services/cluster-config", + scheme))) // Member Commands - .add(new Link(CliStrings.LIST_MEMBER, toUri("/members"))) - .add(new Link(CliStrings.DESCRIBE_MEMBER, toUri("/members/{name}"))) + .add(new Link(CliStrings.LIST_MEMBER, toUri("/members", scheme))) + .add(new Link(CliStrings.DESCRIBE_MEMBER, toUri("/members/{name}", scheme))) // Region Commands - .add(new Link(CliStrings.LIST_REGION, toUri("/regions"))) - .add(new Link(CliStrings.DESCRIBE_REGION, toUri("/regions/{name}"))) - .add(new Link(CliStrings.ALTER_REGION, toUri("/regions/{name}"), HttpMethod.PUT)) - .add(new Link(CliStrings.CREATE_REGION, toUri("/regions"), HttpMethod.POST)) - .add(new Link(CliStrings.DESTROY_REGION, toUri("/regions/{name}"), HttpMethod.DELETE)) + .add(new Link(CliStrings.LIST_REGION, toUri("/regions", scheme))) + .add(new Link(CliStrings.DESCRIBE_REGION, toUri("/regions/{name}", scheme))) + .add(new Link(CliStrings.ALTER_REGION, toUri("/regions/{name}", scheme), HttpMethod.PUT)) + .add(new Link(CliStrings.CREATE_REGION, toUri("/regions", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.DESTROY_REGION, toUri("/regions/{name}", scheme), HttpMethod.DELETE)) // Index Commands - .add(new Link(CliStrings.LIST_INDEX, toUri("/indexes"))) - .add(new Link(CliStrings.CLEAR_DEFINED_INDEXES, toUri("/indexes?op=clear-defined"), HttpMethod.DELETE)) - .add(new Link(CliStrings.CREATE_INDEX, toUri("/indexes"), HttpMethod.POST)) - .add(new Link(CliStrings.CREATE_DEFINED_INDEXES, toUri("/indexes?op=create-defined"), HttpMethod.POST)) - .add(new Link(CliStrings.DEFINE_INDEX, toUri("/indexes?op=define"), HttpMethod.POST)) - .add(new Link(CliStrings.DESTROY_INDEX, toUri("/indexes"), HttpMethod.DELETE)) - .add(new Link(CliStrings.DESTROY_INDEX, toUri("/indexes/{name}"), HttpMethod.DELETE)) + .add(new Link(CliStrings.LIST_INDEX, toUri("/indexes", scheme))) + .add(new Link(CliStrings.CLEAR_DEFINED_INDEXES, toUri("/indexes?op=clear-defined", + scheme), HttpMethod.DELETE)) + .add(new Link(CliStrings.CREATE_INDEX, toUri("/indexes", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.CREATE_DEFINED_INDEXES, toUri("/indexes?op=create-defined", + scheme), HttpMethod.POST)) + .add(new Link(CliStrings.DEFINE_INDEX, toUri("/indexes?op=define", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.DESTROY_INDEX, toUri("/indexes", scheme), HttpMethod.DELETE)) + .add(new Link(CliStrings.DESTROY_INDEX, toUri("/indexes/{name}", scheme), HttpMethod.DELETE)) // Data Commands - .add(new Link(CliStrings.GET, toUri("/regions/{region}/data"), HttpMethod.GET)) - .add(new Link(CliStrings.PUT, toUri("/regions/{region}/data"), HttpMethod.PUT)) - .add(new Link(CliStrings.REMOVE, toUri("/regions/{region}/data"), HttpMethod.DELETE)) - .add(new Link(CliStrings.EXPORT_DATA, toUri("/members/{member}/regions/{region}/data"), HttpMethod.GET)) - .add(new Link(CliStrings.IMPORT_DATA, toUri("/members/{member}/regions/{region}/data"), HttpMethod.POST)) - .add(new Link(CliStrings.LOCATE_ENTRY, toUri("/regions/{region}/data/location"), HttpMethod.GET)) - .add(new Link(CliStrings.QUERY, toUri("/regions/data/query"), HttpMethod.GET)) - .add(new Link(CliStrings.REBALANCE, toUri("/regions/data?op=rebalance"), HttpMethod.POST)) + .add(new Link(CliStrings.GET, toUri("/regions/{region}/data", scheme), HttpMethod.GET)) + .add(new Link(CliStrings.PUT, toUri("/regions/{region}/data", scheme), HttpMethod.PUT)) + .add(new Link(CliStrings.REMOVE, toUri("/regions/{region}/data", scheme), HttpMethod.DELETE)) + .add(new Link(CliStrings.EXPORT_DATA, toUri("/members/{member}/regions/{region}/data", scheme), HttpMethod.GET)) + .add(new Link(CliStrings.IMPORT_DATA, toUri("/members/{member}/regions/{region}/data", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.LOCATE_ENTRY, toUri("/regions/{region}/data/location", scheme), HttpMethod.GET)) + .add(new Link(CliStrings.QUERY, toUri("/regions/data/query", scheme), HttpMethod.GET)) + .add(new Link(CliStrings.REBALANCE, toUri("/regions/data?op=rebalance", scheme), HttpMethod.POST)) // Function Commands - .add(new Link(CliStrings.LIST_FUNCTION, toUri("/functions"))) - .add(new Link(CliStrings.DESTROY_FUNCTION, toUri("/functions/{id}"), HttpMethod.DELETE)) - .add(new Link(CliStrings.EXECUTE_FUNCTION, toUri("/functions/{id}"), HttpMethod.POST)) + .add(new Link(CliStrings.LIST_FUNCTION, toUri("/functions", scheme))) + .add(new Link(CliStrings.DESTROY_FUNCTION, toUri("/functions/{id}", scheme), HttpMethod.DELETE)) + .add(new Link(CliStrings.EXECUTE_FUNCTION, toUri("/functions/{id}", scheme), HttpMethod.POST)) // Client Commands - .add(new Link(CliStrings.LIST_CLIENTS, toUri("/clients"))) - .add(new Link(CliStrings.DESCRIBE_CLIENT, toUri("/clients/{clientID}"))) + .add(new Link(CliStrings.LIST_CLIENTS, toUri("/clients", scheme))) + .add(new Link(CliStrings.DESCRIBE_CLIENT, toUri("/clients/{clientID}", scheme))) // Config Commands - .add(new Link(CliStrings.ALTER_RUNTIME_CONFIG, toUri("/config"), HttpMethod.POST)) - .add(new Link(CliStrings.DESCRIBE_CONFIG, toUri("/members/{member}/config"))) - .add(new Link(CliStrings.EXPORT_CONFIG, toUri("/config"))) - .add(new Link(CliStrings.EXPORT_SHARED_CONFIG, toUri("/config/cluster"))) - .add(new Link(CliStrings.IMPORT_SHARED_CONFIG, toUri("/config/cluster"), HttpMethod.POST)) + .add(new Link(CliStrings.ALTER_RUNTIME_CONFIG, toUri("/config", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.DESCRIBE_CONFIG, toUri("/members/{member}/config", scheme))) + .add(new Link(CliStrings.EXPORT_CONFIG, toUri("/config", scheme))) + .add(new Link(CliStrings.EXPORT_SHARED_CONFIG, toUri("/config/cluster", scheme))) + .add(new Link(CliStrings.IMPORT_SHARED_CONFIG, toUri("/config/cluster", scheme), HttpMethod.POST)) // Deploy Commands - .add(new Link(CliStrings.LIST_DEPLOYED, toUri("/deployed"))) - .add(new Link(CliStrings.DEPLOY, toUri("/deployed"), HttpMethod.POST)) - .add(new Link(CliStrings.UNDEPLOY, toUri("/deployed"), HttpMethod.DELETE)) + .add(new Link(CliStrings.LIST_DEPLOYED, toUri("/deployed", scheme))) + .add(new Link(CliStrings.DEPLOY, toUri("/deployed", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.UNDEPLOY, toUri("/deployed", scheme), HttpMethod.DELETE)) // Disk Store Commands - .add(new Link(CliStrings.LIST_DISK_STORE, toUri("/diskstores"))) - .add(new Link(CliStrings.BACKUP_DISK_STORE, toUri("/diskstores?op=backup"), HttpMethod.POST)) - .add(new Link(CliStrings.COMPACT_DISK_STORE, toUri("/diskstores/{name}?op=compact"), HttpMethod.POST)) - .add(new Link(CliStrings.CREATE_DISK_STORE, toUri("/diskstores"), HttpMethod.POST)) - .add(new Link(CliStrings.DESCRIBE_DISK_STORE, toUri("/diskstores/{name}"))) - .add(new Link(CliStrings.DESTROY_DISK_STORE, toUri("/diskstores/{name}"), HttpMethod.DELETE)) - .add(new Link(CliStrings.REVOKE_MISSING_DISK_STORE, toUri("/diskstores/{id}?op=revoke"), HttpMethod.POST)) - .add(new Link(CliStrings.SHOW_MISSING_DISK_STORE, toUri("/diskstores/missing"))) + .add(new Link(CliStrings.LIST_DISK_STORE, toUri("/diskstores", scheme))) + .add(new Link(CliStrings.BACKUP_DISK_STORE, toUri("/diskstores?op=backup", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.COMPACT_DISK_STORE, toUri("/diskstores/{name}?op=compact", + scheme), HttpMethod.POST)) + .add(new Link(CliStrings.CREATE_DISK_STORE, toUri("/diskstores", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.DESCRIBE_DISK_STORE, toUri("/diskstores/{name}", scheme))) + .add(new Link(CliStrings.DESTROY_DISK_STORE, toUri("/diskstores/{name}", scheme), HttpMethod.DELETE)) + .add(new Link(CliStrings.REVOKE_MISSING_DISK_STORE, toUri("/diskstores/{id}?op=revoke", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.SHOW_MISSING_DISK_STORE, toUri("/diskstores/missing", scheme))) // Durable Client Commands - .add(new Link(CliStrings.LIST_DURABLE_CQS, toUri("/durable-clients/{durable-client-id}/cqs"))) - .add(new Link(CliStrings.COUNT_DURABLE_CQ_EVENTS, toUri("/durable-clients/{durable-client-id}/cqs/events"))) - .add(new Link(CliStrings.COUNT_DURABLE_CQ_EVENTS, toUri("/durable-clients/{durable-client-id}/cqs/{durable-cq-name}/events"))) - .add(new Link(CliStrings.CLOSE_DURABLE_CLIENTS, toUri("/durable-clients/{durable-client-id}?op=close"), HttpMethod.POST)) - .add(new Link(CliStrings.CLOSE_DURABLE_CQS, toUri("/durable-clients/{durable-client-id}/cqs/{durable-cq-name}?op=close"), HttpMethod.POST)) + .add(new Link(CliStrings.LIST_DURABLE_CQS, toUri("/durable-clients/{durable-client-id}/cqs", scheme))) + .add(new Link(CliStrings.COUNT_DURABLE_CQ_EVENTS, toUri("/durable-clients/{durable-client-id}/cqs/events", scheme))) + .add(new Link(CliStrings.COUNT_DURABLE_CQ_EVENTS, toUri("/durable-clients/{durable-client-id}/cqs/{durable-cq-name}/events", scheme))) + .add(new Link(CliStrings.CLOSE_DURABLE_CLIENTS, toUri("/durable-clients/{durable-client-id}?op=close", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.CLOSE_DURABLE_CQS, toUri("/durable-clients/{durable-client-id}/cqs/{durable-cq-name}?op=close", scheme), HttpMethod.POST)) // Launcher Lifecycle Commands - .add(new Link(CliStrings.STATUS_LOCATOR, toUri("/members/{name}/locator"))) - .add(new Link(CliStrings.STATUS_SERVER, toUri("/members/{name}/server"))) + .add(new Link(CliStrings.STATUS_LOCATOR, toUri("/members/{name}/locator", scheme))) + .add(new Link(CliStrings.STATUS_SERVER, toUri("/members/{name}/server", scheme))) // Miscellaneous Commands - .add(new Link(CliStrings.CHANGE_LOGLEVEL, toUri("/groups/{groups}/loglevel"), HttpMethod.POST)) - .add(new Link(CliStrings.CHANGE_LOGLEVEL, toUri("/members/{members}/loglevel"), HttpMethod.POST)) - .add(new Link(CliStrings.CHANGE_LOGLEVEL, toUri("/members/{members}/groups/{groups}/loglevel"), HttpMethod.POST)) - .add(new Link(CliStrings.EXPORT_LOGS, toUri("/logs"))) - .add(new Link(CliStrings.EXPORT_STACKTRACE, toUri("/stacktraces"))) - .add(new Link(CliStrings.GC, toUri("/gc"), HttpMethod.POST)) - .add(new Link(CliStrings.GC, toUri("/members/{member}/gc"), HttpMethod.POST)) - .add(new Link(CliStrings.NETSTAT, toUri("/netstat"))) - .add(new Link(CliStrings.SHOW_DEADLOCK, toUri("/deadlocks"))) - .add(new Link(CliStrings.SHOW_LOG, toUri("/members/{member}/log"))) - .add(new Link(CliStrings.SHOW_METRICS, toUri("/metrics"))) - .add(new Link(CliStrings.SHUTDOWN, toUri("/shutdown"), HttpMethod.POST)) // verb! + .add(new Link(CliStrings.CHANGE_LOGLEVEL, toUri("/groups/{groups}/loglevel", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.CHANGE_LOGLEVEL, toUri("/members/{members}/loglevel", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.CHANGE_LOGLEVEL, toUri("/members/{members}/groups/{groups}/loglevel", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.EXPORT_LOGS, toUri("/logs", scheme))) + .add(new Link(CliStrings.EXPORT_STACKTRACE, toUri("/stacktraces", scheme))) + .add(new Link(CliStrings.GC, toUri("/gc", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.GC, toUri("/members/{member}/gc", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.NETSTAT, toUri("/netstat", scheme))) + .add(new Link(CliStrings.SHOW_DEADLOCK, toUri("/deadlocks", scheme))) + .add(new Link(CliStrings.SHOW_LOG, toUri("/members/{member}/log", scheme))) + .add(new Link(CliStrings.SHOW_METRICS, toUri("/metrics", scheme))) + .add(new Link(CliStrings.SHUTDOWN, toUri("/shutdown", scheme), HttpMethod.POST)) // verb! // Queue Commands - .add(new Link(CliStrings.CREATE_ASYNC_EVENT_QUEUE, toUri("/async-event-queues"), HttpMethod.POST)) - .add(new Link(CliStrings.LIST_ASYNC_EVENT_QUEUES, toUri("/async-event-queues"))) + .add(new Link(CliStrings.CREATE_ASYNC_EVENT_QUEUE, toUri("/async-event-queues", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.LIST_ASYNC_EVENT_QUEUES, toUri("/async-event-queues", scheme))) // PDX Commands - .add(new Link(CliStrings.CONFIGURE_PDX, toUri("/pdx"), HttpMethod.POST)) + .add(new Link(CliStrings.CONFIGURE_PDX, toUri("/pdx", scheme), HttpMethod.POST)) //.add(new Link(CliStrings.PDX_DELETE_FIELD, toUri("/pdx/type/field"), HttpMethod.DELETE)) - .add(new Link(CliStrings.PDX_RENAME, toUri("/pdx/type"), HttpMethod.POST)) + .add(new Link(CliStrings.PDX_RENAME, toUri("/pdx/type", scheme), HttpMethod.POST)) // Shell Commands - .add(new Link(MBEAN_ATTRIBUTE_LINK_RELATION, toUri("/mbean/attribute"))) - .add(new Link(MBEAN_OPERATION_LINK_RELATION, toUri("/mbean/operation"), HttpMethod.POST)) - .add(new Link(MBEAN_QUERY_LINK_RELATION, toUri("/mbean/query"), HttpMethod.POST)) - .add(new Link(PING_LINK_RELATION, toUri("/ping"), HttpMethod.GET)) - .add(new Link(CliStrings.VERSION, toUri("/version"))) + .add(new Link(MBEAN_ATTRIBUTE_LINK_RELATION, toUri("/mbean/attribute", scheme))) + .add(new Link(MBEAN_OPERATION_LINK_RELATION, toUri("/mbean/operation", scheme), HttpMethod.POST)) + .add(new Link(MBEAN_QUERY_LINK_RELATION, toUri("/mbean/query", scheme), HttpMethod.POST)) + .add(new Link(PING_LINK_RELATION, toUri("/ping", scheme), HttpMethod.GET)) + .add(new Link(CliStrings.VERSION, toUri("/version", scheme))) // WAN Gateway Commands - .add(new Link(CliStrings.LIST_GATEWAY, toUri("/gateways"))) - .add(new Link(CliStrings.CREATE_GATEWAYRECEIVER, toUri("/gateways/receivers"), HttpMethod.POST)) - .add(new Link(CliStrings.CREATE_GATEWAYSENDER, toUri("/gateways/senders"), HttpMethod.POST)) - .add(new Link(CliStrings.LOAD_BALANCE_GATEWAYSENDER, toUri("/gateways/senders/{id}?op=load-balance"), HttpMethod.POST)) - .add(new Link(CliStrings.PAUSE_GATEWAYSENDER, toUri("/gateways/senders/{id}?op=pause"), HttpMethod.POST)) - .add(new Link(CliStrings.RESUME_GATEWAYSENDER, toUri("/gateways/senders/{id}?op=resume"), HttpMethod.POST)) - .add(new Link(CliStrings.START_GATEWAYRECEIVER, toUri("/gateways/receivers?op=start"), HttpMethod.POST)) - .add(new Link(CliStrings.START_GATEWAYSENDER, toUri("/gateways/senders?op=start"), HttpMethod.POST)) - .add(new Link(CliStrings.STATUS_GATEWAYRECEIVER, toUri("/gateways/receivers"))) - .add(new Link(CliStrings.STATUS_GATEWAYSENDER, toUri("/gateways/senders/{id}"))) - .add(new Link(CliStrings.STOP_GATEWAYRECEIVER, toUri("/gateways/receivers?op=stop"), HttpMethod.POST)) - .add(new Link(CliStrings.STOP_GATEWAYSENDER, toUri("/gateways/senders/{id}?op=stop"), HttpMethod.POST)) - ; + .add(new Link(CliStrings.LIST_GATEWAY, toUri("/gateways", scheme))) + .add(new Link(CliStrings.CREATE_GATEWAYRECEIVER, toUri("/gateways/receivers", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.CREATE_GATEWAYSENDER, toUri("/gateways/senders", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.LOAD_BALANCE_GATEWAYSENDER, toUri("/gateways/senders/{id}?op=load-balance", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.PAUSE_GATEWAYSENDER, toUri("/gateways/senders/{id}?op=pause", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.RESUME_GATEWAYSENDER, toUri("/gateways/senders/{id}?op=resume", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.START_GATEWAYRECEIVER, toUri("/gateways/receivers?op=start", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.START_GATEWAYSENDER, toUri("/gateways/senders?op=start", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.STATUS_GATEWAYRECEIVER, toUri("/gateways/receivers", scheme))) + .add(new Link(CliStrings.STATUS_GATEWAYSENDER, toUri("/gateways/senders/{id}", scheme))) + .add(new Link(CliStrings.STOP_GATEWAYRECEIVER, toUri("/gateways/receivers?op=stop", scheme), HttpMethod.POST)) + .add(new Link(CliStrings.STOP_GATEWAYSENDER, toUri("/gateways/senders/{id}?op=stop", scheme), HttpMethod.POST)) + ; } @RequestMapping(method = { RequestMethod.GET, RequestMethod.HEAD }, value = "/ping") http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e9aa18bd/gemfire-web/build.gradle ---------------------------------------------------------------------- diff --git a/gemfire-web/build.gradle b/gemfire-web/build.gradle index b9629d3..f0de25a 100755 --- a/gemfire-web/build.gradle +++ b/gemfire-web/build.gradle @@ -4,13 +4,15 @@ dependencies { runtime 'org.springframework:spring-aspects:3.2.12.RELEASE' runtime 'org.springframework:spring-oxm:3.2.12.RELEASE' runtime 'commons-fileupload:commons-fileupload:1.3.1' + + testCompile 'org.springframework:spring-test:3.2.12.RELEASE' provided 'javax.servlet:javax.servlet-api:3.1.0' // have to use output since we exclude the dependent classes from jar :( provided project(path: ':gemfire-core', configuration: 'classesOutput') - provided project(':gemfire-core') + testRuntime project(':gemfire-core') provided project(path: ':gemfire-junit', configuration: 'testOutput') } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e9aa18bd/gemfire-web/src/test/java/com/gemstone/gemfire/management/internal/web/controllers/ShellCommandsControllerJUnitTest.java ---------------------------------------------------------------------- diff --git a/gemfire-web/src/test/java/com/gemstone/gemfire/management/internal/web/controllers/ShellCommandsControllerJUnitTest.java b/gemfire-web/src/test/java/com/gemstone/gemfire/management/internal/web/controllers/ShellCommandsControllerJUnitTest.java index c02b3ee..07d1012 100644 --- a/gemfire-web/src/test/java/com/gemstone/gemfire/management/internal/web/controllers/ShellCommandsControllerJUnitTest.java +++ b/gemfire-web/src/test/java/com/gemstone/gemfire/management/internal/web/controllers/ShellCommandsControllerJUnitTest.java @@ -19,7 +19,6 @@ package com.gemstone.gemfire.management.internal.web.controllers; import static org.junit.Assert.*; import java.lang.reflect.Method; -import java.net.URI; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -38,9 +37,15 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.junit.experimental.categories.Category; +import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.shell.core.CommandMarker; import org.springframework.shell.core.annotation.CliCommand; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; /** * The ShellCommandsControllerJUnitTest class is a test suite of test cases testing the contract and functionality of the @@ -59,11 +64,10 @@ public class ShellCommandsControllerJUnitTest { @BeforeClass public static void setupBeforeClass() { - controller = new ShellCommandsController() { - @Override protected URI toUri(final String path) { - return URI.create(UriUtils.encode(path)); - } - }; + controller = new ShellCommandsController(); + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setContextPath("gemfire"); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); } @AfterClass @@ -99,6 +103,10 @@ public class ShellCommandsControllerJUnitTest { } protected List getControllerWebServiceEndpoints() { + RequestAttributes requestAttrs = RequestContextHolder.getRequestAttributes(); + HttpServletRequest servletRequest = ((ServletRequestAttributes) requestAttrs).getRequest(); + String scheme = servletRequest.getScheme(); + try { Set> controllerClasses = ClasspathScanLoadHelper.loadAndGet( "com.gemstone.gemfire.management.internal.web.controllers", AbstractCommandsController.class, true); @@ -112,7 +120,7 @@ public class ShellCommandsControllerJUnitTest { RequestMapping requestMappingAnnotation = method.getAnnotation(RequestMapping.class); String webServiceEndpoint = String.format("%1$s %2$s", requestMappingAnnotation.method()[0], - requestMappingAnnotation.value()[0]); + UriUtils.decode(controller.toUri(requestMappingAnnotation.value()[0], scheme).toString())); String[] requestParameters = requestMappingAnnotation.params(); @@ -136,7 +144,7 @@ public class ShellCommandsControllerJUnitTest { @Test public void testUniqueIndex() { - LinkIndex linkIndex = controller.index(); + LinkIndex linkIndex = controller.index("https"); List conflicts = new ArrayList<>(); Map uriRelationMapping = new HashMap<>(linkIndex.size()); @@ -161,7 +169,7 @@ public class ShellCommandsControllerJUnitTest { assertNotNull(commands); assertFalse(commands.isEmpty()); - LinkIndex linkIndex = controller.index(); + LinkIndex linkIndex = controller.index("https"); assertNotNull(linkIndex); assertFalse(linkIndex.isEmpty()); @@ -190,7 +198,7 @@ public class ShellCommandsControllerJUnitTest { assertNotNull(controllerWebServiceEndpoints); assertFalse(controllerWebServiceEndpoints.isEmpty()); - LinkIndex linkIndex = controller.index(); + LinkIndex linkIndex = controller.index("http"); assertNotNull(linkIndex); assertFalse(linkIndex.isEmpty()); @@ -208,8 +216,25 @@ public class ShellCommandsControllerJUnitTest { missingControllerWebServiceEndpoints.removeAll(controllerWebServiceEndpoints); assertTrue(String.format( - "The Management REST API Web Service Controllers in (%1$s) are missing the following REST API Web Service Endpoint(s): %2$s!", + "The Management REST API Web Service Controllers in (%1$s) are missing the following REST API Web Service Endpoint(s): %2$s!", getClass().getPackage().getName(), missingControllerWebServiceEndpoints), missingControllerWebServiceEndpoints.isEmpty()); } + @Test + public void testIndexUrisHaveCorrectScheme() { + String versionCmd = "version"; + List controllerWebServiceEndpoints = getControllerWebServiceEndpoints(); + + assertNotNull(controllerWebServiceEndpoints); + assertFalse(controllerWebServiceEndpoints.isEmpty()); + + String testScheme = "xyz"; + LinkIndex linkIndex = controller.index(testScheme); + + assertNotNull(linkIndex); + assertFalse(linkIndex.isEmpty()); + + assertTrue(String.format("Link does not have correct scheme %1$s", linkIndex.find(versionCmd)), + testScheme.equals(linkIndex.find(versionCmd).getHref().getScheme())); + } }