# Sample system.properties file
#
##   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.

#    Commons Logging properties
#    Used by HttpComponents 4.x, see: 
#    http://hc.apache.org/httpcomponents-client-4.3.x/logging.html
#
# By default, Commons Logging is configured by JMeter to use the same logging system
# as the main JMeter code; to configure it please see jmeter.properties.
#
# Uncomment to enable debugging of Commons Logging setup; may be useful if
# implementation cannot be instantiated:
#org.apache.commons.logging.diagnostics.dest=STDERR
#
# Uncomment to enable Commons Logging to use standard output
#org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
#org.apache.commons.logging.simplelog.showdatetime=true
#
# Uncomment the following two lines to generate basic debug logging for HC4.x
#org.apache.commons.logging.simplelog.log.org.apache.http=DEBUG
#org.apache.commons.logging.simplelog.log.org.apache.http.wire=ERROR

# Java networking-related properties
#
# For details of Oracle Java network properties, see for example:
# http://download.oracle.com/javase/1.5.0/docs/guide/net/properties.html
#
#java.net.preferIPv4Stack=false
#java.net.preferIPv6Addresses=false
#networkaddress.cache.ttl=-1
#networkaddress.cache.negative.ttl=10

#
#
# SSL properties (moved from jmeter.properties)
#
# See http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#Customization
# for information on the javax.ssl system properties

# Truststore properties (trusted certificates)
#javax.net.ssl.trustStore=/path/to/[jsse]cacerts
#javax.net.ssl.trustStorePassword
#javax.net.ssl.trustStoreProvider
#javax.net.ssl.trustStoreType [default = KeyStore.getDefaultType()]

# Keystore properties (client certificates)
# Location
#javax.net.ssl.keyStore=.keystore
#
#The password to your keystore
#javax.net.ssl.keyStorePassword=changeit
#
#javax.net.ssl.keyStoreProvider
#javax.net.ssl.keyStoreType [default = KeyStore.getDefaultType()]

# SSL debugging:
# See http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#Debug
#
# javax.net.debug=help - generates the list below:
#all            turn on all debugging
#ssl            turn on ssl debugging
#
#The following can be used with ssl:
#        record       enable per-record tracing
#        handshake    print each handshake message
#        keygen       print key generation data
#        session      print session activity
#        defaultctx   print default SSL initialization
#        sslctx       print SSLContext tracing
#        sessioncache print session cache tracing
#        keymanager   print key manager tracing
#        trustmanager print trust manager tracing
#
#        handshake debugging can be widened with:
#        data         hex dump of each handshake message
#        verbose      verbose handshake message printing
#
#        record debugging can be widened with:
#        plaintext    hex dump of record plaintext
#
# Examples:
#javax.net.debug=ssl
#javax.net.debug=sslctx,session,sessioncache
#
#
# We enable the following property to allow headers such as "Host" to be passed through.
# See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6996110
sun.net.http.allowRestrictedHeaders=true

#Uncomment for Kerberos authentication and edit the 2 config files to match your domains
#With the following configuration krb5.conf and jaas.conf must be located in bin folder
#You can modify these file paths to use absolute location
#java.security.krb5.conf=krb5.conf
#java.security.auth.login.config=jaas.conf

# Location of keytool application
# This property can be defined if JMeter cannot find the application automatically
# It should not be necessary in most cases.
#keytool.directory=<Java Home Directory>/bin
