You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@knox.apache.org by su...@apache.org on 2016/03/22 21:25:48 UTC

[1/3] knox git commit: KNOX-673 Ambari UI proxy support with related REST API support changes

Repository: knox
Updated Branches:
  refs/heads/master 8cb451daf -> ff8c1e250


http://git-wip-us.apache.org/repos/asf/knox/blob/ff8c1e25/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/post-data-wrong-type.json
----------------------------------------------------------------------
diff --git a/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/post-data-wrong-type.json b/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/post-data-wrong-type.json
new file mode 100644
index 0000000..bc17305
--- /dev/null
+++ b/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/post-data-wrong-type.json
@@ -0,0 +1,421 @@
+{
+  "recommend": "configurations",
+  "hosts": [
+    "c6401.ambari.apache.org"
+  ],
+  "services": [
+    "HBASE",
+    "HDFS",
+    "HIVE",
+    "KNOX",
+    "MAPREDUCE2",
+    "PIG",
+    "RANGER",
+    "SPARK",
+    "TEZ",
+    "YARN",
+    "ZOOKEEPER"
+  ],
+  "recommendations": {
+    "blueprint": {
+      "host_groups": [
+        {
+          "name": "host-group-1",
+          "components": [
+            {
+              "name": "HBASE_CLIENT"
+            },
+            {
+              "name": "HDFS_CLIENT"
+            },
+            {
+              "name": "HCAT"
+            },
+            {
+              "name": "HIVE_CLIENT"
+            },
+            {
+              "name": "MAPREDUCE2_CLIENT"
+            },
+            {
+              "name": "PIG"
+            },
+            {
+              "name": "SPARK_CLIENT"
+            },
+            {
+              "name": "TEZ_CLIENT"
+            },
+            {
+              "name": "YARN_CLIENT"
+            },
+            {
+              "name": "ZOOKEEPER_CLIENT"
+            },
+            {
+              "name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "DATANODE"
+            },
+            {
+              "name": "NODEMANAGER"
+            },
+            {
+              "name": "HBASE_MASTER"
+            },
+            {
+              "name": "NAMENODE"
+            },
+            {
+              "name": "SECONDARY_NAMENODE"
+            },
+            {
+              "name": "HIVE_METASTORE"
+            },
+            {
+              "name": "HIVE_SERVER"
+            },
+            {
+              "name": "MYSQL_SERVER"
+            },
+            {
+              "name": "WEBHCAT_SERVER"
+            },
+            {
+              "name": "KNOX_GATEWAY"
+            },
+            {
+              "name": "HISTORYSERVER"
+            },
+            {
+              "name": "RANGER_ADMIN"
+            },
+            {
+              "name": "RANGER_USERSYNC"
+            },
+            {
+              "name": "SPARK_JOBHISTORYSERVER"
+            },
+            {
+              "name": "APP_TIMELINE_SERVER"
+            },
+            {
+              "name": "RESOURCEMANAGER"
+            },
+            {
+              "name": "ZOOKEEPER_SERVER"
+            }
+          ]
+        }
+      ],
+      "configurations": {
+        "hbase-env": {
+          "properties": {
+            "hbase_regionserver_heapsize": "1024",
+            "hbase_master_heapsize": "1024",
+            "hbase_user": "hbase",
+            "hbase_regionserver_xmn_max": "512",
+            "hbase_regionserver_xmn_ratio": "0.2",
+            "hbase_log_dir": "/var/log/hbase",
+            "hbase_user_nofile_limit": "32000",
+            "hbase_user_nproc_limit": "16000",
+            "phoenix_sql_enabled": "false",
+            "content": "\n# Set environment variables here.\n\n# The java implementation to use. Java 1.6 required.\nexport JAVA_HOME={{java64_home}}\n\n# HBase Configuration directory\nexport HBASE_CONF_DIR=${HBASE_CONF_DIR:-{{hbase_conf_dir}}}\n\n# Extra Java CLASSPATH elements. Optional.\nexport HBASE_CLASSPATH=${HBASE_CLASSPATH}\n\n\n# The maximum amount of heap to use, in MB. Default is 1000.\n# export HBASE_HEAPSIZE=1000\n\n# Extra Java runtime options.\n# Below are what we set by default. May only work with SUN JVM.\n# For more on why as well as other possible settings,\n# see http://wiki.apache.org/hadoop/PerformanceTuning\nexport SERVER_GC_OPTS=\"-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:{{log_dir}}/gc.log-`date +'%Y%m%d%H%M'`\"\n# Uncomment below to enable java garbage collection logging.\n# export HBASE_OPTS=\"$HBASE_OPTS -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:$HBASE_HOME/logs/gc-hbase.log\"\n\n# Uncomment and adjust to enable 
 JMX exporting\n# See jmxremote.password and jmxremote.access in $JRE_HOME/lib/management to configure remote password access.\n# More details at: http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html\n#\n# export HBASE_JMX_BASE=\"-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false\"\n# If you want to configure BucketCache, specify '-XX: MaxDirectMemorySize=' with proper direct memory size\n# export HBASE_THRIFT_OPTS=\"$HBASE_JMX_BASE -Dcom.sun.management.jmxremote.port=10103\"\n# export HBASE_ZOOKEEPER_OPTS=\"$HBASE_JMX_BASE -Dcom.sun.management.jmxremote.port=10104\"\n\n# File naming hosts on which HRegionServers will run. $HBASE_HOME/conf/regionservers by default.\nexport HBASE_REGIONSERVERS=${HBASE_CONF_DIR}/regionservers\n\n# Extra ssh options. Empty by default.\n# export HBASE_SSH_OPTS=\"-o ConnectTimeout=1 -o SendEnv=HBASE_CONF_DIR\"\n\n# Where log files are stored. $HBASE_HOME/logs by default.\nexport HBASE_LOG_DIR={{l
 og_dir}}\n\n# A string representing this instance of hbase. $USER by default.\n# export HBASE_IDENT_STRING=$USER\n\n# The scheduling priority for daemon processes. See 'man nice'.\n# export HBASE_NICENESS=10\n\n# The directory where pid files are stored. /tmp by default.\nexport HBASE_PID_DIR={{pid_dir}}\n\n# Seconds to sleep between slave commands. Unset by default. This\n# can be useful in large clusters, where, e.g., slave rsyncs can\n# otherwise arrive faster than the master can service them.\n# export HBASE_SLAVE_SLEEP=0.1\n\n# Tell HBase whether it should manage it's own instance of Zookeeper or not.\nexport HBASE_MANAGES_ZK=false\n\n{% if java_version < 8 %}\nJDK_DEPENDED_OPTS=\"-XX:PermSize=128m -XX:MaxPermSize=128m\"\n{% endif %}\n      \n{% if security_enabled %}\nexport HBASE_OPTS=\"$HBASE_OPTS -XX:+UseConcMarkSweepGC -XX:ErrorFile={{log_dir}}/hs_err_pid%p.log -Djava.security.auth.login.config={{client_jaas_config_file}} -Djava.io.tmpdir={{java_io_tmpdir}}\"\nexport HBASE
 _MASTER_OPTS=\"$HBASE_MASTER_OPTS -Xmx{{master_heapsize}} -Djava.security.auth.login.config={{master_jaas_config_file}} $JDK_DEPENDED_OPTS\"\nexport HBASE_REGIONSERVER_OPTS=\"$HBASE_REGIONSERVER_OPTS -Xmn{{regionserver_xmn_size}} -XX:CMSInitiatingOccupancyFraction=70  -Xms{{regionserver_heapsize}} -Xmx{{regionserver_heapsize}} -Djava.security.auth.login.config={{regionserver_jaas_config_file}} $JDK_DEPENDED_OPTS\"\nexport PHOENIX_QUERYSERVER_OPTS=\"$PHOENIX_QUERYSERVER_OPTS -Djava.security.auth.login.config={{queryserver_jaas_config_file}}\"\n{% else %}\nexport HBASE_OPTS=\"$HBASE_OPTS -XX:+UseConcMarkSweepGC -XX:ErrorFile={{log_dir}}/hs_err_pid%p.log -Djava.io.tmpdir={{java_io_tmpdir}}\"\nexport HBASE_MASTER_OPTS=\"$HBASE_MASTER_OPTS -Xmx{{master_heapsize}} $JDK_DEPENDED_OPTS\"\nexport HBASE_REGIONSERVER_OPTS=\"$HBASE_REGIONSERVER_OPTS -Xmn{{regionserver_xmn_size}} -XX:CMSInitiatingOccupancyFraction=70  -Xms{{regionserver_heapsize}} -Xmx{{regionserver_heapsize}} $JDK_DEPENDED_OPTS\
 "\n{% endif %}\n\n# HBase off-heap MaxDirectMemorySize\nexport HBASE_REGIONSERVER_OPTS=\"$HBASE_REGIONSERVER_OPTS {% if hbase_max_direct_memory_size %} -XX:MaxDirectMemorySize={{hbase_max_direct_memory_size}}m {% endif %}\"",
+            "hbase_pid_dir": "/var/run/hbase",
+            "hbase_java_io_tmpdir": "/tmp"
+          }
+        },
+        "hbase-log4j": {
+          "properties": {
+            "content": "\n# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements.  See the NOTICE file\n# distributed with this work for additional information\n# regarding copyright ownership.  The ASF licenses this file\n# to you under the Apache License, Version 2.0 (the\n# \"License\"); you may not use this file except in compliance\n# with the License.  You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\n# Define some default values that can be overridden by system properties\nhbase.root.logger=INFO,console\nhbase.security.logger=INFO,console\nhbase.log.dir=.\nhbase
 .log.file=hbase.log\n\n# Define the root logger to the system property \"hbase.root.logger\".\nlog4j.rootLogger=${hbase.root.logger}\n\n# Logging Threshold\nlog4j.threshold=ALL\n\n#\n# Daily Rolling File Appender\n#\nlog4j.appender.DRFA=org.apache.log4j.DailyRollingFileAppender\nlog4j.appender.DRFA.File=${hbase.log.dir}/${hbase.log.file}\n\n# Rollver at midnight\nlog4j.appender.DRFA.DatePattern=.yyyy-MM-dd\n\n# 30-day backup\n#log4j.appender.DRFA.MaxBackupIndex=30\nlog4j.appender.DRFA.layout=org.apache.log4j.PatternLayout\n\n# Pattern format: Date LogLevel LoggerName LogMessage\nlog4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c{2}: %m%n\n\n# Rolling File Appender properties\nhbase.log.maxfilesize=256MB\nhbase.log.maxbackupindex=20\n\n# Rolling File Appender\nlog4j.appender.RFA=org.apache.log4j.RollingFileAppender\nlog4j.appender.RFA.File=${hbase.log.dir}/${hbase.log.file}\n\nlog4j.appender.RFA.MaxFileSize=${hbase.log.maxfilesize}\nlog4j.appender.RFA.MaxBackupInde
 x=${hbase.log.maxbackupindex}\n\nlog4j.appender.RFA.layout=org.apache.log4j.PatternLayout\nlog4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c{2}: %m%n\n\n#\n# Security audit appender\n#\nhbase.security.log.file=SecurityAuth.audit\nhbase.security.log.maxfilesize=256MB\nhbase.security.log.maxbackupindex=20\nlog4j.appender.RFAS=org.apache.log4j.RollingFileAppender\nlog4j.appender.RFAS.File=${hbase.log.dir}/${hbase.security.log.file}\nlog4j.appender.RFAS.MaxFileSize=${hbase.security.log.maxfilesize}\nlog4j.appender.RFAS.MaxBackupIndex=${hbase.security.log.maxbackupindex}\nlog4j.appender.RFAS.layout=org.apache.log4j.PatternLayout\nlog4j.appender.RFAS.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n\nlog4j.category.SecurityLogger=${hbase.security.logger}\nlog4j.additivity.SecurityLogger=false\n#log4j.logger.SecurityLogger.org.apache.hadoop.hbase.security.access.AccessController=TRACE\n\n#\n# Null Appender\n#\nlog4j.appender.NullAppender=org.apache.log4j.varia.NullAppende
 r\n\n#\n# console\n# Add \"console\" to rootlogger above if you want to use this\n#\nlog4j.appender.console=org.apache.log4j.ConsoleAppender\nlog4j.appender.console.target=System.err\nlog4j.appender.console.layout=org.apache.log4j.PatternLayout\nlog4j.appender.console.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c{2}: %m%n\n\n# Custom Logging levels\n\nlog4j.logger.org.apache.zookeeper=INFO\n#log4j.logger.org.apache.hadoop.fs.FSNamesystem=DEBUG\nlog4j.logger.org.apache.hadoop.hbase=INFO\n# Make these two classes INFO-level. Make them DEBUG to see more zk debug.\nlog4j.logger.org.apache.hadoop.hbase.zookeeper.ZKUtil=INFO\nlog4j.logger.org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher=INFO\n#log4j.logger.org.apache.hadoop.dfs=DEBUG\n# Set this class to log INFO only otherwise its OTT\n# Enable this to get detailed connection error/retry logging.\n# log4j.logger.org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation=TRACE\n\n\n# Uncomment this line to enable tr
 acing on _every_ RPC call (this can be a lot of output)\n#log4j.logger.org.apache.hadoop.ipc.HBaseServer.trace=DEBUG\n\n# Uncomment the below if you want to remove logging of client region caching'\n# and scan of .META. messages\n# log4j.logger.org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation=INFO\n# log4j.logger.org.apache.hadoop.hbase.client.MetaScanner=INFO"
+          }
+        },
+        "hbase-policy": {
+          "properties": {
+            "security.admin.protocol.acl": "*",
+            "security.client.protocol.acl": "*",
+            "security.masterregion.protocol.acl": "*"
+          }
+        },
+        "hbase-site": {
+          "properties": {
+            "hbase.hstore.compactionThreshold": "3",
+            "hfile.block.cache.size": "0.4",
+            "hbase.hregion.max.filesize": "10737418240",
+            "hbase.regionserver.handler.count": "30",
+            "hbase.hregion.majorcompaction": "604800000",
+            "hbase.client.scanner.caching": "100",
+            "hbase.hregion.memstore.block.multiplier": "4",
+            "zookeeper.session.timeout": "90000",
+            "hbase.client.keyvalue.maxsize": "1048576",
+            "hbase.hregion.memstore.flush.size": "134217728",
+            "hbase.coprocessor.master.classes": "",
+            "hbase.coprocessor.region.classes": "org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint",
+            "hbase.defaults.for.version.skip": "true",
+            "hbase.hregion.majorcompaction.jitter": "0.50",
+            "hbase.hregion.memstore.mslab.enabled": "true",
+            "hbase.hstore.blockingStoreFiles": "10",
+            "hbase.hstore.compaction.max": "10",
+            "hbase.local.dir": "${hbase.tmp.dir}/local",
+            "hbase.master.info.bindAddress": "0.0.0.0",
+            "hbase.master.info.port": "16010",
+            "hbase.master.port": "16000",
+            "hbase.regionserver.global.memstore.size": "0.4",
+            "hbase.regionserver.info.port": "16030",
+            "hbase.regionserver.port": "16020",
+            "hbase.regionserver.wal.codec": "org.apache.hadoop.hbase.regionserver.wal.WALCellCodec",
+            "hbase.rootdir": "hdfs://c6401.ambari.apache.org:8020/apps/hbase/data",
+            "hbase.rpc.protection": "authentication",
+            "hbase.rpc.timeout": "90000",
+            "hbase.security.authentication": "simple",
+            "hbase.security.authorization": "false",
+            "hbase.superuser": "hbase",
+            "hbase.tmp.dir": "/tmp/hbase-${user.name}",
+            "hbase.zookeeper.property.clientPort": "2181",
+            "hbase.zookeeper.quorum": "c6401.ambari.apache.org",
+            "hbase.zookeeper.useMulti": "true",
+            "phoenix.query.timeoutMs": "60000",
+            "zookeeper.znode.parent": "/hbase-unsecure",
+            "dfs.domain.socket.path": "/var/lib/hadoop-hdfs/dn_socket",
+            "hbase.bulkload.staging.dir": "/apps/hbase/staging",
+            "hbase.client.retries.number": "35",
+            "hbase.cluster.distributed": "true",
+            "hbase_master_hosts": [
+              "c6401.ambari.apache.org"
+            ],
+            "hbase_regionserver_hosts": [
+              "c6401.ambari.apache.org"
+            ]
+          }
+        },
+        "ranger-hbase-audit": {
+          "properties": {
+            "xasecure.audit.credential.provider.file": "jceks://file{{credential_file}}",
+            "xasecure.audit.destination.db": "false",
+            "xasecure.audit.destination.db.batch.filespool.dir": "/var/log/hbase/audit/db/spool",
+            "xasecure.audit.destination.db.jdbc.driver": "{{jdbc_driver}}",
+            "xasecure.audit.destination.db.jdbc.url": "{{audit_jdbc_url}}",
+            "xasecure.audit.destination.db.password": "SECRET:ranger-hbase-audit:2:xasecure.audit.destination.db.password",
+            "xasecure.audit.destination.db.user": "{{xa_audit_db_user}}",
+            "xasecure.audit.destination.hdfs": "true",
+            "xasecure.audit.destination.hdfs.batch.filespool.dir": "/var/log/hbase/audit/hdfs/spool",
+            "xasecure.audit.destination.hdfs.dir": "hdfs://c6401.ambari.apache.org:8020/ranger/audit",
+            "xasecure.audit.destination.solr": "false",
+            "xasecure.audit.destination.solr.batch.filespool.dir": "/var/log/hbase/audit/solr/spool",
+            "xasecure.audit.destination.solr.urls": "",
+            "xasecure.audit.destination.solr.zookeepers": "NONE",
+            "xasecure.audit.is.enabled": "true",
+            "xasecure.audit.provider.summary.enabled": "true"
+          }
+        },
+        "ranger-hbase-plugin-properties": {
+          "properties": {
+            "ranger-hbase-plugin-enabled": "No",
+            "REPOSITORY_CONFIG_PASSWORD": "SECRET:ranger-hbase-plugin-properties:2:REPOSITORY_CONFIG_PASSWORD",
+            "REPOSITORY_CONFIG_USERNAME": "hbase",
+            "common.name.for.certificate": "",
+            "policy_user": "ambari-qa"
+          }
+        },
+        "ranger-hbase-policymgr-ssl": {
+          "properties": {
+            "xasecure.policymgr.clientssl.keystore": "/usr/hdp/current/hbase-client/conf/ranger-plugin-keystore.jks",
+            "xasecure.policymgr.clientssl.keystore.credential.file": "jceks://file{{credential_file}}",
+            "xasecure.policymgr.clientssl.keystore.password": "SECRET:ranger-hbase-policymgr-ssl:2:xasecure.policymgr.clientssl.keystore.password",
+            "xasecure.policymgr.clientssl.truststore": "/usr/hdp/current/hbase-client/conf/ranger-plugin-truststore.jks",
+            "xasecure.policymgr.clientssl.truststore.credential.file": "jceks://file{{credential_file}}",
+            "xasecure.policymgr.clientssl.truststore.password": "SECRET:ranger-hbase-policymgr-ssl:2:xasecure.policymgr.clientssl.truststore.password"
+          }
+        },
+        "ranger-hbase-security": {
+          "properties": {
+            "ranger.plugin.hbase.policy.cache.dir": "/etc/ranger/{{repo_name}}/policycache",
+            "ranger.plugin.hbase.policy.pollIntervalMs": "30000",
+            "ranger.plugin.hbase.policy.rest.ssl.config.file": "/etc/hbase/conf/ranger-policymgr-ssl.xml",
+            "ranger.plugin.hbase.policy.rest.url": "{{policymgr_mgr_url}}",
+            "ranger.plugin.hbase.policy.source.impl": "org.apache.ranger.admin.client.RangerAdminRESTClient",
+            "ranger.plugin.hbase.service.name": "{{repo_name}}",
+            "xasecure.hbase.update.xapolicies.on.grant.revoke": "true"
+          }
+        },
+        "admin-properties": {
+          "properties": {
+            "SQL_CONNECTOR_JAR": "/usr/share/java/mysql-connector-java.jar",
+            "DB_FLAVOR": "MYSQL",
+            "audit_db_name": "ranger_audit",
+            "audit_db_password": "SECRET:admin-properties:1:audit_db_password",
+            "audit_db_user": "rangerlogger",
+            "db_host": "c6401.ambari.apache.org",
+            "db_name": "ranger",
+            "db_password": "SECRET:admin-properties:1:db_password",
+            "db_root_password": "SECRET:admin-properties:1:db_root_password",
+            "db_root_user": "root",
+            "db_user": "rangeradmin",
+            "policymgr_external_url": "http://c6401.ambari.apache.org:6080"
+          }
+        },
+        "ranger-admin-site": {
+          "properties": {
+            "ranger.audit.solr.password": "SECRET:ranger-admin-site:1:ranger.audit.solr.password",
+            "ranger.audit.solr.urls": "",
+            "ranger.audit.solr.username": "ranger_solr",
+            "ranger.audit.solr.zookeepers": "NONE",
+            "ranger.audit.source.type": "solr",
+            "ranger.authentication.method": "UNIX",
+            "ranger.credential.provider.path": "/etc/ranger/admin/rangeradmin.jceks",
+            "ranger.externalurl": "{{ranger_external_url}}",
+            "ranger.https.attrib.keystore.file": "/etc/ranger/admin/conf/ranger-admin-keystore.jks",
+            "ranger.jpa.audit.jdbc.credential.alias": "rangeraudit",
+            "ranger.jpa.audit.jdbc.dialect": "{{jdbc_dialect}}",
+            "ranger.jpa.audit.jdbc.driver": "{{ranger_jdbc_driver}}",
+            "ranger.jpa.audit.jdbc.password": "SECRET:ranger-admin-site:1:ranger.jpa.audit.jdbc.password",
+            "ranger.jpa.audit.jdbc.url": "{{audit_jdbc_url}}",
+            "ranger.jpa.audit.jdbc.user": "{{ranger_audit_db_user}}",
+            "ranger.jpa.jdbc.credential.alias": "rangeradmin",
+            "ranger.jpa.jdbc.dialect": "{{jdbc_dialect}}",
+            "ranger.jpa.jdbc.driver": "com.mysql.jdbc.Driver",
+            "ranger.jpa.jdbc.password": "SECRET:ranger-admin-site:1:ranger.jpa.jdbc.password",
+            "ranger.jpa.jdbc.url": "jdbc:mysql://c6401.ambari.apache.org/ranger",
+            "ranger.jpa.jdbc.user": "{{ranger_db_user}}",
+            "ranger.ldap.ad.base.dn": "dc=example,dc=com",
+            "ranger.ldap.ad.bind.dn": "{{ranger_ug_ldap_bind_dn}}",
+            "ranger.ldap.ad.bind.password": "SECRET:ranger-admin-site:1:ranger.ldap.ad.bind.password",
+            "ranger.ldap.ad.domain": "",
+            "ranger.ldap.ad.referral": "ignore",
+            "ranger.ldap.ad.url": "{{ranger_ug_ldap_url}}",
+            "ranger.ldap.ad.user.searchfilter": "{{ranger_ug_ldap_user_searchfilter}}",
+            "ranger.ldap.base.dn": "dc=example,dc=com",
+            "ranger.ldap.bind.dn": "{{ranger_ug_ldap_bind_dn}}",
+            "ranger.ldap.bind.password": "SECRET:ranger-admin-site:1:ranger.ldap.bind.password",
+            "ranger.ldap.group.roleattribute": "cn",
+            "ranger.ldap.group.searchbase": "{{ranger_ug_ldap_group_searchbase}}",
+            "ranger.ldap.group.searchfilter": "{{ranger_ug_ldap_group_searchfilter}}",
+            "ranger.ldap.referral": "ignore",
+            "ranger.ldap.url": "{{ranger_ug_ldap_url}}",
+            "ranger.ldap.user.dnpattern": "uid={0},ou=users,dc=xasecure,dc=net",
+            "ranger.ldap.user.searchfilter": "{{ranger_ug_ldap_user_searchfilter}}",
+            "ranger.service.host": "{{ranger_host}}",
+            "ranger.service.http.enabled": "true",
+            "ranger.service.http.port": "6080",
+            "ranger.service.https.attrib.clientAuth": "want",
+            "ranger.service.https.attrib.keystore.keyalias": "rangeradmin",
+            "ranger.service.https.attrib.keystore.pass": "SECRET:ranger-admin-site:1:ranger.service.https.attrib.keystore.pass",
+            "ranger.service.https.attrib.ssl.enabled": "false",
+            "ranger.service.https.port": "6182",
+            "ranger.sso.browser.useragent": "Mozilla,chrome",
+            "ranger.sso.cookiename": "hadoop-jwt",
+            "ranger.sso.enabled": "false",
+            "ranger.sso.providerurl": "",
+            "ranger.sso.publicKey": "",
+            "ranger.sso.query.param.originalurl": "originalUrl",
+            "ranger.unixauth.remote.login.enabled": "true",
+            "ranger.unixauth.service.hostname": "{{ugsync_host}}",
+            "ranger.unixauth.service.port": "5151"
+          }
+        },
+        "ranger-env": {
+          "properties": {
+            "ranger_admin_username": "amb_ranger_admin",
+            "ranger_admin_password": "SECRET:ranger-env:1:ranger_admin_password",
+            "ranger_group": "ranger",
+            "ranger_user": "ranger",
+            "xasecure.audit.destination.solr": "false",
+            "admin_password": "SECRET:ranger-env:1:admin_password",
+            "admin_username": "admin",
+            "bind_anonymous": "false",
+            "create_db_dbuser": "true",
+            "is_solrCloud_enabled": "false",
+            "ranger-hbase-plugin-enabled": "No",
+            "ranger-hdfs-plugin-enabled": "No",
+            "ranger-hive-plugin-enabled": "No",
+            "ranger-kafka-plugin-enabled": "No",
+            "ranger-knox-plugin-enabled": "No",
+            "ranger-storm-plugin-enabled": "No",
+            "ranger-yarn-plugin-enabled": "No",
+            "ranger_admin_log_dir": "/var/log/ranger/admin",
+            "ranger_pid_dir": "/var/run/ranger",
+            "ranger_privelege_user_jdbc_url": "jdbc:mysql://c6401.ambari.apache.org",
+            "ranger_usersync_log_dir": "/var/log/ranger/usersync",
+            "xasecure.audit.destination.db": "false",
+            "xasecure.audit.destination.hdfs": "true",
+            "xasecure.audit.destination.hdfs.dir": "hdfs://c6401.ambari.apache.org:8020/ranger/audit",
+            "xml_configurations_supported": "true"
+          }
+        },
+        "ranger-site": {
+          "properties": {
+            "ranger_admin_hosts": [
+              "c6401.ambari.apache.org"
+            ]
+          }
+        },
+        "ranger-ugsync-site": {
+          "properties": {
+            "ranger.usersync.credstore.filename": "/usr/hdp/current/ranger-usersync/conf/ugsync.jceks",
+            "ranger.usersync.enabled": "true",
+            "ranger.usersync.filesource.file": "/tmp/usergroup.txt",
+            "ranger.usersync.filesource.text.delimiter": ",",
+            "ranger.usersync.group.memberattributename": "",
+            "ranger.usersync.group.nameattribute": "",
+            "ranger.usersync.group.objectclass": "",
+            "ranger.usersync.group.searchbase": "",
+            "ranger.usersync.group.searchenabled": "false",
+            "ranger.usersync.group.searchfilter": "",
+            "ranger.usersync.group.searchscope": "",
+            "ranger.usersync.group.usermapsyncenabled": "true",
+            "ranger.usersync.keystore.file": "/usr/hdp/current/ranger-usersync/conf/unixauthservice.jks",
+            "ranger.usersync.keystore.password": "SECRET:ranger-ugsync-site:1:ranger.usersync.keystore.password",
+            "ranger.usersync.ldap.bindalias": "testldapalias",
+            "ranger.usersync.ldap.binddn": "",
+            "ranger.usersync.ldap.bindkeystore": "",
+            "ranger.usersync.ldap.groupname.caseconversion": "lower",
+            "ranger.usersync.ldap.ldapbindpassword": "",
+            "ranger.usersync.ldap.referral": "ignore",
+            "ranger.usersync.ldap.searchBase": "dc=hadoop,dc=apache,dc=org",
+            "ranger.usersync.ldap.url": "",
+            "ranger.usersync.ldap.user.groupnameattribute": "memberof, ismemberof",
+            "ranger.usersync.ldap.user.nameattribute": "",
+            "ranger.usersync.ldap.user.objectclass": "person",
+            "ranger.usersync.ldap.user.searchbase": "",
+            "ranger.usersync.ldap.user.searchfilter": "",
+            "ranger.usersync.ldap.user.searchscope": "sub",
+            "ranger.usersync.ldap.username.caseconversion": "lower",
+            "ranger.usersync.logdir": "/var/log/ranger/usersync",
+            "ranger.usersync.pagedresultsenabled": "true",
+            "ranger.usersync.pagedresultssize": "500",
+            "ranger.usersync.passwordvalidator.path": "./native/credValidator.uexe",
+            "ranger.usersync.policymanager.baseURL": "{{ranger_external_url}}",
+            "ranger.usersync.policymanager.maxrecordsperapicall": "1000",
+            "ranger.usersync.policymanager.mockrun": "false",
+            "ranger.usersync.port": "5151",
+            "ranger.usersync.sink.impl.class": "org.apache.ranger.unixusersync.process.PolicyMgrUserGroupBuilder",
+            "ranger.usersync.sleeptimeinmillisbetweensynccycle": "60000",
+            "ranger.usersync.source.impl.class": "org.apache.ranger.unixusersync.process.UnixUserGroupBuilder",
+            "ranger.usersync.ssl": "true",
+            "ranger.usersync.truststore.file": "/usr/hdp/current/ranger-usersync/conf/mytruststore.jks",
+            "ranger.usersync.truststore.password": "SECRET:ranger-ugsync-site:1:ranger.usersync.truststore.password",
+            "ranger.usersync.unix.group.file": "/etc/group",
+            "ranger.usersync.unix.minUserId": "500",
+            "ranger.usersync.unix.password.file": "/etc/passwd"
+          }
+        },
+        "usersync-properties": {
+          "properties": {}
+        }
+      }
+    },
+    "blueprint_cluster_binding": {
+      "host_groups": [
+        {
+          "name": "host-group-1",
+          "hosts": [
+            {
+              "fqdn": "c6401.ambari.apache.org"
+            }
+          ]
+        }
+      ]
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/knox/blob/ff8c1e25/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/unwise-character-response.json
----------------------------------------------------------------------
diff --git a/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/unwise-character-response.json b/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/unwise-character-response.json
new file mode 100644
index 0000000..e216f8d
--- /dev/null
+++ b/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/unwise-character-response.json
@@ -0,0 +1,410 @@
+{
+  "items": [
+    {
+      "ServiceComponentInfo": {
+        "component_name": "HBASE_MASTER",
+        "service_name": "HBASE"
+      },
+      "host_components": [
+        {
+          "HostRoles": {
+            "component_name": "HBASE_MASTER",
+            "host_name": "c6401.ambari.apache.org",
+            "maintenance_state": "OFF",
+            "stale_configs": false,
+            "state": "INSTALLED"
+          }
+        }
+      ]
+    },
+    {
+      "ServiceComponentInfo": {
+        "component_name": "NAMENODE",
+        "service_name": "HDFS"
+      },
+      "host_components": [
+        {
+          "HostRoles": {
+            "component_name": "NAMENODE",
+            "host_name": "c6401.ambari.apache.org",
+            "maintenance_state": "OFF",
+            "stale_configs": false,
+            "state": "STARTED"
+          },
+          "metrics": {
+            "dfs": {
+              "FSNamesystem": {
+                "BlockCapacity": 2097152,
+                "BlocksTotal": 54,
+                "CapacityNonDFSUsed": 35660591104,
+                "CapacityRemaining": 488078696448,
+                "CapacityRemainingGB": 455.0,
+                "CapacityTotal": 524208947200,
+                "CapacityTotalGB": 488.0,
+                "CapacityUsed": 469659648,
+                "CapacityUsedGB": 0.0,
+                "CorruptBlocks": 0,
+                "ExcessBlocks": 0,
+                "ExpiredHeartbeats": 0,
+                "FilesTotal": 163,
+                "HAState": "active",
+                "LastCheckpointTime": 1458249036957,
+                "LastWrittenTransactionId": 8188,
+                "MillisSinceLastLoadedEdits": 0,
+                "MissingBlocks": 0,
+                "MissingReplOneBlocks": 0,
+                "PendingDataNodeMessageCount": 0,
+                "PendingDeletionBlocks": 0,
+                "PendingReplicationBlocks": 0,
+                "PostponedMisreplicatedBlocks": 0,
+                "ScheduledReplicationBlocks": 0,
+                "Snapshots": 0,
+                "SnapshottableDirectories": 0,
+                "StaleDataNodes": 0,
+                "TotalFiles": 163,
+                "TotalLoad": 2,
+                "TransactionsSinceLastCheckpoint": 593,
+                "TransactionsSinceLastLogRoll": 593,
+                "UnderReplicatedBlocks": 54
+              },
+              "namenode": {
+                "DeadNodes": "{}",
+                "DecomNodes": "{}",
+                "LiveNodes": "{\"c6401.ambari.apache.org:50010\":{\"infoAddr\":\"192.168.64.101:50075\",\"infoSecureAddr\":\"192.168.64.101:0\",\"xferaddr\":\"192.168.64.101:50010\",\"lastContact\":1,\"usedSpace\":469659648,\"adminState\":\"In Service\",\"nonDfsUsedSpace\":35660591104,\"capacity\":524208947200,\"numBlocks\":54,\"version\":\"2.7.1.2.3.4.0-3485\",\"used\":469659648,\"remaining\":488078696448,\"blockScheduled\":0,\"blockPoolUsed\":469659648,\"blockPoolUsedPercent\":0.08959398,\"volfails\":0}}",
+                "Safemode": "",
+                "TotalFiles": 163,
+                "UpgradeFinalized": true,
+                "Version": "2.7.1.2.3.4.0-3485, ref0582ca14b8177a3cbb6376807545272677d730"
+              }
+            },
+            "jvm": {
+              "HeapMemoryMax": 1060372480,
+              "HeapMemoryUsed": 76247256,
+              "memHeapCommittedM": 1011.25,
+              "memHeapUsedM": 72.30267
+            },
+            "rpc": {
+              "RpcQueueTime_avg_time": 0.0
+            },
+            "runtime": {
+              "StartTime": 1458141632197
+            }
+          }
+        }
+      ]
+    },
+    {
+      "ServiceComponentInfo": {
+        "component_name": "SECONDARY_NAMENODE",
+        "service_name": "HDFS"
+      },
+      "host_components": [
+        {
+          "HostRoles": {
+            "component_name": "SECONDARY_NAMENODE",
+            "host_name": "c6401.ambari.apache.org",
+            "maintenance_state": "OFF",
+            "stale_configs": false,
+            "state": "STARTED"
+          }
+        }
+      ]
+    },
+    {
+      "ServiceComponentInfo": {
+        "component_name": "HIVE_METASTORE",
+        "service_name": "HIVE"
+      },
+      "host_components": [
+        {
+          "HostRoles": {
+            "component_name": "HIVE_METASTORE",
+            "host_name": "c6401.ambari.apache.org",
+            "maintenance_state": "OFF",
+            "stale_configs": false,
+            "state": "STARTED"
+          }
+        }
+      ]
+    },
+    {
+      "ServiceComponentInfo": {
+        "component_name": "HIVE_SERVER",
+        "service_name": "HIVE"
+      },
+      "host_components": [
+        {
+          "HostRoles": {
+            "component_name": "HIVE_SERVER",
+            "host_name": "c6401.ambari.apache.org",
+            "maintenance_state": "OFF",
+            "stale_configs": false,
+            "state": "STARTED"
+          }
+        }
+      ]
+    },
+    {
+      "ServiceComponentInfo": {
+        "component_name": "MYSQL_SERVER",
+        "service_name": "HIVE"
+      },
+      "host_components": [
+        {
+          "HostRoles": {
+            "component_name": "MYSQL_SERVER",
+            "host_name": "c6401.ambari.apache.org",
+            "maintenance_state": "OFF",
+            "stale_configs": false,
+            "state": "STARTED"
+          }
+        }
+      ]
+    },
+    {
+      "ServiceComponentInfo": {
+        "component_name": "WEBHCAT_SERVER",
+        "service_name": "HIVE"
+      },
+      "host_components": [
+        {
+          "HostRoles": {
+            "component_name": "WEBHCAT_SERVER",
+            "host_name": "c6401.ambari.apache.org",
+            "maintenance_state": "OFF",
+            "stale_configs": false,
+            "state": "STARTED"
+          }
+        }
+      ]
+    },
+    {
+      "ServiceComponentInfo": {
+        "component_name": "KNOX_GATEWAY",
+        "service_name": "KNOX"
+      },
+      "host_components": [
+        {
+          "HostRoles": {
+            "component_name": "KNOX_GATEWAY",
+            "host_name": "c6401.ambari.apache.org",
+            "maintenance_state": "OFF",
+            "stale_configs": false,
+            "state": "STARTED"
+          }
+        }
+      ]
+    },
+    {
+      "ServiceComponentInfo": {
+        "component_name": "HISTORYSERVER",
+        "service_name": "MAPREDUCE2"
+      },
+      "host_components": [
+        {
+          "HostRoles": {
+            "component_name": "HISTORYSERVER",
+            "host_name": "c6401.ambari.apache.org",
+            "maintenance_state": "OFF",
+            "stale_configs": false,
+            "state": "STARTED"
+          }
+        }
+      ]
+    },
+    {
+      "ServiceComponentInfo": {
+        "component_name": "RANGER_ADMIN",
+        "service_name": "RANGER"
+      },
+      "host_components": [
+        {
+          "HostRoles": {
+            "component_name": "RANGER_ADMIN",
+            "host_name": "c6401.ambari.apache.org",
+            "maintenance_state": "OFF",
+            "stale_configs": false,
+            "state": "STARTED"
+          }
+        }
+      ]
+    },
+    {
+      "ServiceComponentInfo": {
+        "component_name": "RANGER_USERSYNC",
+        "service_name": "RANGER"
+      },
+      "host_components": [
+        {
+          "HostRoles": {
+            "component_name": "RANGER_USERSYNC",
+            "host_name": "c6401.ambari.apache.org",
+            "maintenance_state": "OFF",
+            "stale_configs": false,
+            "state": "STARTED"
+          }
+        }
+      ]
+    },
+    {
+      "ServiceComponentInfo": {
+        "component_name": "SPARK_JOBHISTORYSERVER",
+        "service_name": "SPARK"
+      },
+      "host_components": [
+        {
+          "HostRoles": {
+            "component_name": "SPARK_JOBHISTORYSERVER",
+            "host_name": "c6401.ambari.apache.org",
+            "maintenance_state": "OFF",
+            "stale_configs": false,
+            "state": "STARTED"
+          }
+        }
+      ]
+    },
+    {
+      "ServiceComponentInfo": {
+        "component_name": "APP_TIMELINE_SERVER",
+        "service_name": "YARN"
+      },
+      "host_components": [
+        {
+          "HostRoles": {
+            "component_name": "APP_TIMELINE_SERVER",
+            "host_name": "c6401.ambari.apache.org",
+            "maintenance_state": "OFF",
+            "stale_configs": false,
+            "state": "STARTED"
+          }
+        }
+      ]
+    },
+    {
+      "ServiceComponentInfo": {
+        "component_name": "RESOURCEMANAGER",
+        "service_name": "YARN"
+      },
+      "host_components": [
+        {
+          "HostRoles": {
+            "component_name": "RESOURCEMANAGER",
+            "ha_state": "ACTIVE",
+            "host_name": "c6401.ambari.apache.org",
+            "maintenance_state": "OFF",
+            "stale_configs": false,
+            "state": "STARTED"
+          },
+          "metrics": {
+            "jvm": {
+              "HeapMemoryMax": 1037959168,
+              "HeapMemoryUsed": 35935488,
+              "memHeapCommittedM": 44.6875,
+              "memHeapUsedM": 33.870148
+            },
+            "rpc": {
+              "RpcQueueTime_avg_time": 0.14285714285714285
+            },
+            "runtime": {
+              "StartTime": 1458074932210
+            },
+            "yarn": {
+              "ClusterMetrics": {
+                "NumActiveNMs": 1,
+                "NumDecommissionedNMs": 0,
+                "NumLostNMs": 0,
+                "NumRebootedNMs": 0,
+                "NumUnhealthyNMs": 0
+              },
+              "Queue": {
+                "root": {
+                  "AMResourceLimitMB": 0,
+                  "AMResourceLimitVCores": 0,
+                  "ActiveApplications": 0,
+                  "ActiveUsers": 0,
+                  "AggregateContainersAllocated": 19,
+                  "AggregateContainersReleased": 19,
+                  "AllocatedContainers": 0,
+                  "AllocatedMB": 0,
+                  "AllocatedVCores": 0,
+                  "AppAttemptFirstContainerAllocationDelayAvgTime": 0.0,
+                  "AppAttemptFirstContainerAllocationDelayNumOps": 0,
+                  "AppsCompleted": 6,
+                  "AppsFailed": 0,
+                  "AppsKilled": 0,
+                  "AppsPending": 0,
+                  "AppsRunning": 0,
+                  "AppsSubmitted": 6,
+                  "AvailableMB": 512,
+                  "AvailableVCores": 1,
+                  "PendingContainers": 0,
+                  "PendingMB": 0,
+                  "PendingVCores": 0,
+                  "ReservedContainers": 0,
+                  "ReservedMB": 0,
+                  "ReservedVCores": 0,
+                  "UsedAMResourceMB": 0,
+                  "UsedAMResourceVCores": 0,
+                  "running_0": 0,
+                  "running_1440": 0,
+                  "running_300": 0,
+                  "running_60": 0,
+                  "default": {
+                    "AMResourceLimitMB": 170,
+                    "AMResourceLimitVCores": 1,
+                    "ActiveApplications": 0,
+                    "ActiveUsers": 0,
+                    "AggregateContainersAllocated": 19,
+                    "AggregateContainersReleased": 19,
+                    "AllocatedContainers": 0,
+                    "AllocatedMB": 0,
+                    "AllocatedVCores": 0,
+                    "AppAttemptFirstContainerAllocationDelayAvgTime": 0.0,
+                    "AppAttemptFirstContainerAllocationDelayNumOps": 0,
+                    "AppsCompleted": 6,
+                    "AppsFailed": 0,
+                    "AppsKilled": 0,
+                    "AppsPending": 0,
+                    "AppsRunning": 0,
+                    "AppsSubmitted": 6,
+                    "AvailableMB": 512,
+                    "AvailableVCores": 1,
+                    "PendingContainers": 0,
+                    "PendingMB": 0,
+                    "PendingVCores": 0,
+                    "ReservedContainers": 0,
+                    "ReservedMB": 0,
+                    "ReservedVCores": 0,
+                    "UsedAMResourceMB": 0,
+                    "UsedAMResourceVCores": 0,
+                    "running_0": 0,
+                    "running_1440": 0,
+                    "running_300": 0,
+                    "running_60": 0
+                  }
+                }
+              }
+            }
+          }
+        }
+      ]
+    },
+    {
+      "ServiceComponentInfo": {
+        "component_name": "ZOOKEEPER_SERVER",
+        "service_name": "ZOOKEEPER"
+      },
+      "host_components": [
+        {
+          "HostRoles": {
+            "component_name": "ZOOKEEPER_SERVER",
+            "host_name": "c6401.ambari.apache.org",
+            "maintenance_state": "OFF",
+            "stale_configs": false,
+            "state": "STARTED"
+          }
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/knox/blob/ff8c1e25/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Expander.java
----------------------------------------------------------------------
diff --git a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Expander.java b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Expander.java
index 7ec2e91..e37c780 100644
--- a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Expander.java
+++ b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Expander.java
@@ -17,8 +17,10 @@
  */
 package org.apache.hadoop.gateway.util.urltemplate;
 
+import java.io.UnsupportedEncodingException;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.net.URLEncoder;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
@@ -218,10 +220,10 @@ public class Expander {
             } else {
               builder.append( "&" );
             }
-            builder.append( name );
+            appendQueryPart(name, builder);
             if( value != null ) {
               builder.append( "=" );
-              builder.append( value );
+              appendQueryPart(value, builder);
             }
           }
         }
@@ -240,24 +242,32 @@ public class Expander {
           if( i > 0 ) {
             builder.append( "&" );
           }
-          builder.append( queryName );
+          appendQueryPart(queryName, builder);
           value = values.get( i );
           if( value != null ) {
             builder.append( "=" );
-            builder.append( value );
+            appendQueryPart(value, builder);
           }
         }
       } else {
-        builder.append( queryName );
+        appendQueryPart(queryName, builder);
         value = values.get( 0 );
         if( value != null ) {
           builder.append( "=" );
-          builder.append( value );
+          appendQueryPart(value, builder);
         }
       }
     }
   }
 
+  private static void appendQueryPart(String part, StringBuilder builder) {
+    try {
+      builder.append(URLEncoder.encode(part, "UTF-8"));
+    } catch ( UnsupportedEncodingException e ) {
+      builder.append(part);
+    }
+  }
+
   private static void expandFragment( Template template, Set<String> names, Params params, Evaluator evaluator, StringBuilder builder ) {
     if( template.hasFragment() ) {
       builder.append( "#" );

http://git-wip-us.apache.org/repos/asf/knox/blob/ff8c1e25/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/ExpanderTest.java
----------------------------------------------------------------------
diff --git a/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/ExpanderTest.java b/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/ExpanderTest.java
index 7c91e6e..7fd3383 100644
--- a/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/ExpanderTest.java
+++ b/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/ExpanderTest.java
@@ -19,7 +19,6 @@ package org.apache.hadoop.gateway.util.urltemplate;
 
 import org.apache.hadoop.test.category.FastTests;
 import org.apache.hadoop.test.category.UnitTests;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
@@ -29,9 +28,7 @@ import java.util.Arrays;
 import java.util.List;
 
 import static junit.framework.TestCase.assertNotNull;
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.CoreMatchers.*;
 import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.Matchers.equalToIgnoringCase;
 import static org.junit.Assert.assertThat;
@@ -429,7 +426,7 @@ public class ExpanderTest {
     outputUri = Expander.expand( template, match.getParams(), evaluator );
     assertThat(
         outputUri.toString(),
-        equalToIgnoringCase( "https://webhcatTestHost.com:50111/templeton/v1/?version/hive" ) );
+        equalToIgnoringCase( "https://webhcatTestHost.com:50111/templeton/v1/?version%2Fhive" ) );
 
   }
 


[2/3] knox git commit: KNOX-673 Ambari UI proxy support with related REST API support changes

Posted by su...@apache.org.
http://git-wip-us.apache.org/repos/asf/knox/blob/ff8c1e25/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/encrypted-response.txt
----------------------------------------------------------------------
diff --git a/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/encrypted-response.txt b/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/encrypted-response.txt
new file mode 100644
index 0000000..46f5ff7
--- /dev/null
+++ b/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/encrypted-response.txt
@@ -0,0 +1 @@
+"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"
\ No newline at end of file


[3/3] knox git commit: KNOX-673 Ambari UI proxy support with related REST API support changes

Posted by su...@apache.org.
KNOX-673 Ambari UI proxy support with related REST API support changes


Project: http://git-wip-us.apache.org/repos/asf/knox/repo
Commit: http://git-wip-us.apache.org/repos/asf/knox/commit/ff8c1e25
Tree: http://git-wip-us.apache.org/repos/asf/knox/tree/ff8c1e25
Diff: http://git-wip-us.apache.org/repos/asf/knox/diff/ff8c1e25

Branch: refs/heads/master
Commit: ff8c1e250d0dec9e274bed548186af22d66af71a
Parents: 8cb451d
Author: Sumit Gupta <su...@apache.org>
Authored: Tue Mar 22 16:25:30 2016 -0400
Committer: Sumit Gupta <su...@apache.org>
Committed: Tue Mar 22 16:25:43 2016 -0400

----------------------------------------------------------------------
 .../filter/rewrite/i18n/UrlRewriteMessages.java |   2 +
 .../filter/rewrite/impl/UrlRewriteRequest.java  |  16 +-
 .../resources/services/ambari/2.2.0/rewrite.xml |   4 +
 .../resources/services/ambari/2.2.0/service.xml |   6 +-
 .../services/ambariui/2.2.0/rewrite.xml         |  55 +++
 .../services/ambariui/2.2.0/service.xml         |  34 ++
 .../dispatch/PassAllHeadersDispatch.java        |  12 +-
 .../hadoop/test/mock/MockRequestMatcher.java    |  31 +-
 .../gateway/AmbariServiceDefinitionTest.java    |  88 +++-
 .../encrypted-response.txt                      |   1 +
 .../post-data-wrong-type.json                   | 421 +++++++++++++++++++
 .../unwise-character-response.json              | 410 ++++++++++++++++++
 .../gateway/util/urltemplate/Expander.java      |  22 +-
 .../gateway/util/urltemplate/ExpanderTest.java  |   7 +-
 14 files changed, 1073 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/knox/blob/ff8c1e25/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/i18n/UrlRewriteMessages.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/i18n/UrlRewriteMessages.java b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/i18n/UrlRewriteMessages.java
index 1af7974..4f304bc 100644
--- a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/i18n/UrlRewriteMessages.java
+++ b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/i18n/UrlRewriteMessages.java
@@ -82,4 +82,6 @@ public interface UrlRewriteMessages {
   @Message( level = MessageLevel.TRACE, text = "No rule matching URL: {0}, direction: {1}" )
   void noRuleMatchingUrl( Template inputUri, UrlRewriter.Direction direction );
 
+  @Message( level = MessageLevel.TRACE, text = "Failed to decode query string: {0}" )
+  void failedToDecodeQueryString( String queryString, @StackTrace(level = MessageLevel.TRACE) Exception exception );
 }

http://git-wip-us.apache.org/repos/asf/knox/blob/ff8c1e25/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteRequest.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteRequest.java b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteRequest.java
index fd6cd24..73ec5bb 100644
--- a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteRequest.java
+++ b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteRequest.java
@@ -28,6 +28,7 @@ import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteStreamFilterFactor
 import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriter;
 import org.apache.hadoop.gateway.filter.rewrite.i18n.UrlRewriteMessages;
 import org.apache.hadoop.gateway.i18n.messages.MessagesFactory;
+import org.apache.hadoop.gateway.util.MimeTypes;
 import org.apache.hadoop.gateway.util.urltemplate.Parser;
 import org.apache.hadoop.gateway.util.urltemplate.Resolver;
 import org.apache.hadoop.gateway.util.urltemplate.Template;
@@ -40,7 +41,9 @@ import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
 import java.net.URISyntaxException;
+import java.net.URLDecoder;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.List;
@@ -150,7 +153,12 @@ public class UrlRewriteRequest extends GatewayRequestWrapper implements Resolver
   public String getQueryString() {
     String[] split = splitTargetUrl( getTargetUrl() );
     if( split.length > 1 ) {
-      return split[1];
+      try {
+        return URLDecoder.decode(split[1], "UTF-8");
+      } catch ( UnsupportedEncodingException e ) {
+        LOG.failedToDecodeQueryString(split[1], e);
+        return split[1];
+      }
     } else {
       return null;
     }
@@ -215,6 +223,12 @@ public class UrlRewriteRequest extends GatewayRequestWrapper implements Resolver
     if( getContentLength() != 0 ) {
       MimeType mimeType = getMimeType();
       UrlRewriteFilterContentDescriptor filterContentConfig = getRewriteFilterConfig( bodyFilterName, mimeType );
+      if (filterContentConfig != null) {
+        String asType = filterContentConfig.asType();
+        if ( asType != null && asType.trim().length() > 0 ) {
+          mimeType = MimeTypes.create(asType, getCharacterEncoding());
+        }
+      }
       InputStream stream = UrlRewriteStreamFilterFactory.create( mimeType, null, input, rewriter, this, UrlRewriter.Direction.IN, filterContentConfig );
       input = new UrlRewriteRequestStream( stream );
     }

http://git-wip-us.apache.org/repos/asf/knox/blob/ff8c1e25/gateway-service-definitions/src/main/resources/services/ambari/2.2.0/rewrite.xml
----------------------------------------------------------------------
diff --git a/gateway-service-definitions/src/main/resources/services/ambari/2.2.0/rewrite.xml b/gateway-service-definitions/src/main/resources/services/ambari/2.2.0/rewrite.xml
index 68f2791..7c2a825 100644
--- a/gateway-service-definitions/src/main/resources/services/ambari/2.2.0/rewrite.xml
+++ b/gateway-service-definitions/src/main/resources/services/ambari/2.2.0/rewrite.xml
@@ -27,4 +27,8 @@
             <apply path="$.**.href" rule="AMBARI/ambari/href/outbound"/>
         </content>
     </filter>
+    <filter name="AMBARI/ambari/api/inbound">
+        <content type="application/x-www-form-urlencoded" asType="application/octet-stream">
+        </content>
+    </filter>
 </rules>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/knox/blob/ff8c1e25/gateway-service-definitions/src/main/resources/services/ambari/2.2.0/service.xml
----------------------------------------------------------------------
diff --git a/gateway-service-definitions/src/main/resources/services/ambari/2.2.0/service.xml b/gateway-service-definitions/src/main/resources/services/ambari/2.2.0/service.xml
index 0bd2150..bc670f2 100644
--- a/gateway-service-definitions/src/main/resources/services/ambari/2.2.0/service.xml
+++ b/gateway-service-definitions/src/main/resources/services/ambari/2.2.0/service.xml
@@ -14,10 +14,14 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 -->
-<service role="AMBARI" name="ambari" version="2.7.0">
+<service role="AMBARI" name="ambari" version="2.2.0">
     <routes>
         <route path="/ambari/api/v1/**">
             <rewrite apply="AMBARI/ambari/api/outbound" to="response.body"/>
+            <rewrite apply="AMBARI/ambari/api/inbound" to="request.body"/>
+        </route>
+        <route path="/ambari/api/v1/persist/*?*">
+            <rewrite apply="AMBARI/ambari/api/inbound" to="request.body"/>
         </route>
     </routes>
     <dispatch classname="org.apache.hadoop.gateway.dispatch.PassAllHeadersDispatch"/>

http://git-wip-us.apache.org/repos/asf/knox/blob/ff8c1e25/gateway-service-definitions/src/main/resources/services/ambariui/2.2.0/rewrite.xml
----------------------------------------------------------------------
diff --git a/gateway-service-definitions/src/main/resources/services/ambariui/2.2.0/rewrite.xml b/gateway-service-definitions/src/main/resources/services/ambariui/2.2.0/rewrite.xml
new file mode 100644
index 0000000..484c36b
--- /dev/null
+++ b/gateway-service-definitions/src/main/resources/services/ambariui/2.2.0/rewrite.xml
@@ -0,0 +1,55 @@
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<rules>
+    <rule dir="IN" name="AMBARIUI/ambari/inbound/root" pattern="*://*:*/**/ambari/">
+        <rewrite template="{$serviceUrl[AMBARIUI]}/"/>
+    </rule>
+    <rule dir="IN" name="AMBARIUI/ambari/inbound/path" pattern="*://*:*/**/ambari/{**}">
+        <rewrite template="{$serviceUrl[AMBARIUI]}/{**}"/>
+    </rule>
+    <rule dir="IN" name="AMBARIUI/ambari/inbound/query" pattern="*://*:*/**/ambari/{**}?{**}">
+        <rewrite template="{$serviceUrl[AMBARIUI]}/{**}?{**}"/>
+    </rule>
+
+    <rule dir="OUT" name="AMBARIUI/ambari/outbound/extrapath">
+        <rewrite template="{$frontend[path]}/ambari/api/v1"/>
+    </rule>
+
+    <rule dir="OUT" name="AMBARIUI/ambari/outbound/whitelogo">
+        <rewrite template="img/logo-white.png"/>
+    </rule>
+    <rule dir="OUT" name="AMBARIUI/ambari/outbound/logohref">
+        <rewrite template="#/main/dashboard"/>
+    </rule>
+    <rule dir="OUT" name="AMBARIUI/ambari/outbound/ambariview">
+        <rewrite template="img/ambari-view-default.png"/>
+    </rule>
+    <rule dir="OUT" name="AMBARIUI/ambari/outbound/img" pattern="/img/{**}">
+        <rewrite template="{$frontend[url]}/ambari/img/{**}"/>
+    </rule>
+
+    <filter name="AMBARIUI/ambari/outbound/links">
+        <content type="*/x-javascript">
+            <apply path="/api/v1" rule="AMBARIUI/ambari/outbound/extrapath"/>
+            <apply path="/img/logo-white.png" rule="AMBARIUI/ambari/outbound/whitelogo"/>
+            <apply path="/#/main/dashboard" rule="AMBARIUI/ambari/outbound/logohref"/>
+            <apply path="/img/ambari-view-default.png" rule="AMBARIUI/ambari/outbound/ambariview"/>
+        </content>
+        <content type="*/html">
+        </content>
+    </filter>
+</rules>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/knox/blob/ff8c1e25/gateway-service-definitions/src/main/resources/services/ambariui/2.2.0/service.xml
----------------------------------------------------------------------
diff --git a/gateway-service-definitions/src/main/resources/services/ambariui/2.2.0/service.xml b/gateway-service-definitions/src/main/resources/services/ambariui/2.2.0/service.xml
new file mode 100644
index 0000000..786b197
--- /dev/null
+++ b/gateway-service-definitions/src/main/resources/services/ambariui/2.2.0/service.xml
@@ -0,0 +1,34 @@
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<service role="AMBARIUI" name="ambariui" version="2.2.0">
+    <routes>
+        <route path="/ambari">
+            <rewrite apply="AMBARIUI/ambari/inbound/root" to="request.url"/>
+        </route>
+        <route path="/ambari/**">
+            <rewrite apply="AMBARIUI/ambari/inbound/path" to="request.url"/>
+        </route>
+        <route path="/ambari/**?**">
+            <rewrite apply="AMBARIUI/ambari/inbound/query" to="request.url"/>
+        </route>
+        <route path="/ambari/**/app.js">
+            <rewrite apply="AMBARIUI/ambari/outbound/links" to="response.body"/>
+        </route>
+    </routes>
+    <dispatch classname="org.apache.hadoop.gateway.dispatch.PassAllHeadersDispatch"/>
+</service>
+

http://git-wip-us.apache.org/repos/asf/knox/blob/ff8c1e25/gateway-spi/src/main/java/org/apache/hadoop/gateway/dispatch/PassAllHeadersDispatch.java
----------------------------------------------------------------------
diff --git a/gateway-spi/src/main/java/org/apache/hadoop/gateway/dispatch/PassAllHeadersDispatch.java b/gateway-spi/src/main/java/org/apache/hadoop/gateway/dispatch/PassAllHeadersDispatch.java
index 7b8260d..92f9ed7 100644
--- a/gateway-spi/src/main/java/org/apache/hadoop/gateway/dispatch/PassAllHeadersDispatch.java
+++ b/gateway-spi/src/main/java/org/apache/hadoop/gateway/dispatch/PassAllHeadersDispatch.java
@@ -18,10 +18,20 @@
 package org.apache.hadoop.gateway.dispatch;
 
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.Set;
 
 public class PassAllHeadersDispatch extends DefaultDispatch {
 
+  private static Set<String> REQUEST_EXCLUDE_HEADERS;
+
+  @Override
+  public void init() {
+    super.init();
+    REQUEST_EXCLUDE_HEADERS = new HashSet<>();
+    REQUEST_EXCLUDE_HEADERS.add("Content-Length");
+  }
+
   @Override
   public Set<String> getOutboundResponseExcludeHeaders() {
     return Collections.EMPTY_SET;
@@ -29,6 +39,6 @@ public class PassAllHeadersDispatch extends DefaultDispatch {
 
   @Override
   public Set<String> getOutboundRequestExcludeHeaders() {
-    return Collections.EMPTY_SET;
+    return REQUEST_EXCLUDE_HEADERS;
   }
 }

http://git-wip-us.apache.org/repos/asf/knox/blob/ff8c1e25/gateway-test-utils/src/main/java/org/apache/hadoop/test/mock/MockRequestMatcher.java
----------------------------------------------------------------------
diff --git a/gateway-test-utils/src/main/java/org/apache/hadoop/test/mock/MockRequestMatcher.java b/gateway-test-utils/src/main/java/org/apache/hadoop/test/mock/MockRequestMatcher.java
index 3ff8ff9..378f02f 100644
--- a/gateway-test-utils/src/main/java/org/apache/hadoop/test/mock/MockRequestMatcher.java
+++ b/gateway-test-utils/src/main/java/org/apache/hadoop/test/mock/MockRequestMatcher.java
@@ -19,6 +19,9 @@ package org.apache.hadoop.test.mock;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.ArrayUtils;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.utils.URLEncodedUtils;
+import org.apache.http.message.BasicNameValuePair;
 import org.hamcrest.Matcher;
 import org.hamcrest.Matchers;
 
@@ -35,9 +38,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import static org.hamcrest.CoreMatchers.hasItem;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.CoreMatchers.*;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.equalToIgnoringCase;
 import static org.xmlmatchers.XmlMatchers.isEquivalentTo;
@@ -264,34 +265,24 @@ public class MockRequestMatcher {
     // body and we don't want that to happen.
     if( queryParams != null ) {
       String queryString = request.getQueryString();
-      Map<String,String[]> requestParams = parseQueryString( queryString == null ? "" : queryString );
+      List<NameValuePair> requestParams = parseQueryString( queryString == null ? "" : queryString );
       for( String name: queryParams.keySet() ) {
-        String[] values = requestParams.get( name );
         assertThat(
             "Request " + request.getMethod() + " " + request.getRequestURL() +
                 " query string " + queryString + " is missing parameter '" + name + "'",
-            values, notNullValue() );
-        assertThat(
-            "Request " + request.getMethod() + " " + request.getRequestURL() +
-                " query string " + queryString + " is missing a value for parameter '" + name + "'",
-            Arrays.asList( values ), hasItem( queryParams.get( name ) ) );
+            requestParams, hasItem( new BasicNameValuePair(name, queryParams.get(name))) );
       }
     }
     if( formParams != null ) {
       String paramString = IOUtils.toString( request.getInputStream(), request.getCharacterEncoding() );
-      Map<String,String[]> requestParams = parseQueryString( paramString == null ? "" : paramString );
+      List<NameValuePair> requestParams = parseQueryString( paramString == null ? "" : paramString );
       for( String name: formParams.keySet() ) {
-        String[] actualValues = requestParams.get( name );
-        assertThat(
-            "Request " + request.getMethod() + " " + request.getRequestURL() +
-                " form params " + paramString + " is missing parameter '" + name + "'",
-            actualValues, notNullValue() );
         String[] expectedValues = formParams.get( name );
         for( String expectedValue : expectedValues ) {
           assertThat(
               "Request " + request.getMethod() + " " + request.getRequestURL() +
                   " form params " + paramString + " is missing a value " + expectedValue + " for parameter '" + name + "'",
-              Arrays.asList( actualValues ), hasItem( expectedValue ) );
+              requestParams, hasItem( new BasicNameValuePair(name, expectedValue ) ));
         }
       }
     }
@@ -331,10 +322,8 @@ public class MockRequestMatcher {
     return "from=" + from + ", pathInfo=" + pathInfo;
   }
 
-  // Separate method to minimally scope the depreciation suppression.
-  @SuppressWarnings("deprecation")
-  private static Map<String,String[]> parseQueryString( String queryString ) {
-    return javax.servlet.http.HttpUtils.parseQueryString( queryString );
+  private static List<NameValuePair> parseQueryString( String queryString ) {
+    return URLEncodedUtils.parse(queryString, Charset.defaultCharset());
   }
 
 }

http://git-wip-us.apache.org/repos/asf/knox/blob/ff8c1e25/gateway-test/src/test/java/org/apache/hadoop/gateway/AmbariServiceDefinitionTest.java
----------------------------------------------------------------------
diff --git a/gateway-test/src/test/java/org/apache/hadoop/gateway/AmbariServiceDefinitionTest.java b/gateway-test/src/test/java/org/apache/hadoop/gateway/AmbariServiceDefinitionTest.java
index 11563d1..b9f19b7 100644
--- a/gateway-test/src/test/java/org/apache/hadoop/gateway/AmbariServiceDefinitionTest.java
+++ b/gateway-test/src/test/java/org/apache/hadoop/gateway/AmbariServiceDefinitionTest.java
@@ -18,6 +18,7 @@
 package org.apache.hadoop.gateway;
 
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
 import org.apache.hadoop.gateway.services.DefaultGatewayServices;
 import org.apache.hadoop.gateway.services.GatewayServices;
 import org.apache.hadoop.gateway.services.ServiceLifecycleException;
@@ -33,6 +34,7 @@ import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
 import org.hamcrest.MatcherAssert;
 import org.junit.After;
 import org.junit.AfterClass;
+import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.slf4j.Logger;
@@ -49,7 +51,7 @@ import java.util.UUID;
 import static com.jayway.restassured.RestAssured.given;
 import static org.apache.hadoop.test.TestUtils.LOG_ENTER;
 import static org.apache.hadoop.test.TestUtils.LOG_EXIT;
-import static org.hamcrest.CoreMatchers.*;
+import static org.hamcrest.CoreMatchers.notNullValue;
 import static uk.co.datumedge.hamcrest.json.SameJSONAs.sameJSONAs;
 
 public class AmbariServiceDefinitionTest {
@@ -236,4 +238,88 @@ public class AmbariServiceDefinitionTest {
     LOG_EXIT();
   }
 
+  @Test( timeout = TestUtils.MEDIUM_TIMEOUT )
+  public void unwiseCharacterRequest() throws Exception {
+    String username = "guest";
+    String password = "guest-password";
+    String serviceUrl =  clusterUrl + "/ambari/api/v1/clusters/test/components";
+
+    mockAmbari.expect()
+        .method( "GET" )
+        .pathInfo( "/api/v1/clusters/test/components" )
+        .queryParam("ServiceComponentInfo/component_name", "APP_TIMELINE_SERVER|ServiceComponentInfo/category=MASTER")
+        .respond()
+        .status( HttpStatus.SC_OK )
+        .content( TestUtils.getResourceStream( DAT, "unwise-character-response.json" ) )
+        .contentType( "text/plain" );
+    //only assertion here is to make sure the request can be made successfully with the unwise characters present
+    //in the request url
+     given()
+        .auth().preemptive().basic( username, password )
+        .queryParam("ServiceComponentInfo/component_name", "APP_TIMELINE_SERVER|ServiceComponentInfo/category=MASTER")
+        .expect()
+        .statusCode( HttpStatus.SC_OK )
+        .contentType( "text/plain" )
+        .when().get( serviceUrl ).asString();
+
+    LOG_EXIT();
+  }
+
+  @Test( timeout = TestUtils.MEDIUM_TIMEOUT )
+  public void encryptedResponse() throws Exception {
+    LOG_ENTER();
+
+    String username = "guest";
+    String password = "guest-password";
+    String serviceUrl =  clusterUrl + "/ambari/api/v1/persist/CLUSTER_CURRENT_STATUS?_=1457977721091";
+
+    mockAmbari.expect()
+        .method( "GET" )
+        .pathInfo( "/api/v1/persist/CLUSTER_CURRENT_STATUS" )
+        .queryParam("_","1457977721091")
+        .respond()
+        .status( HttpStatus.SC_OK )
+        .content( TestUtils.getResourceStream( DAT, "encrypted-response.txt" ) )
+        .contentType( "text/plain" );
+
+    String body = given()
+        .auth().preemptive().basic( username, password )
+        .expect()
+        .statusCode( HttpStatus.SC_OK )
+        .contentType( "text/plain" )
+        .when().get( serviceUrl ).asString();
+
+    Assert.assertNotNull(body);
+    LOG_EXIT();
+  }
+
+  @Test( timeout = TestUtils.MEDIUM_TIMEOUT )
+  public void postDataWithWrongContentType() throws Exception {
+    LOG_ENTER();
+
+    String username = "guest";
+    String password = "guest-password";
+    String serviceUrl =  clusterUrl + "/ambari/api/v1/stacks/HDP/versions/2.3/recommendations";
+
+    mockAmbari.expect()
+        .method( "POST" )
+        .pathInfo( "/api/v1/stacks/HDP/versions/2.3/recommendations" )
+        .content( TestUtils.getResourceStream( DAT, "post-data-wrong-type.json" ) )
+        .respond()
+        .status( HttpStatus.SC_OK )
+        .contentType( "application/x-www-form-urlencoded" );
+
+
+    String body = given()
+        .auth().preemptive().basic( username, password )
+        .content(IOUtils.toByteArray(TestUtils.getResourceStream( DAT, "post-data-wrong-type.json")))
+        .expect()
+        .statusCode( HttpStatus.SC_OK )
+        .contentType( "application/x-www-form-urlencoded" )
+        .when().post( serviceUrl ).asString();
+
+    Assert.assertNotNull(body);
+    LOG_EXIT();
+  }
+
 }