/* * 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. * */ package org.apache.jmeter.protocol.http.sampler; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.StringTokenizer; import org.apache.commons.lang3.StringUtils; import org.apache.jmeter.JMeter; import org.apache.jmeter.util.JMeterUtils; import org.apache.jorphan.util.JOrphanUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Common parent class for HttpClient implementations. * * Includes system property settings that are handled internally by the Java HTTP implementation, * but which need to be explicitly configured in HttpClient implementations. */ public abstract class HTTPHCAbstractImpl extends HTTPAbstractImpl { private static final Logger log = LoggerFactory.getLogger(HTTPHCAbstractImpl.class); protected static final String PROXY_HOST = System.getProperty("http.proxyHost",""); protected static final String NONPROXY_HOSTS = System.getProperty("http.nonProxyHosts",""); protected static final int PROXY_PORT = Integer.parseInt(System.getProperty("http.proxyPort","0")); protected static final boolean PROXY_DEFINED = PROXY_HOST.length() > 0 && PROXY_PORT > 0; protected static final String PROXY_USER = JMeterUtils.getPropDefault(JMeter.HTTP_PROXY_USER,""); protected static final String PROXY_PASS = JMeterUtils.getPropDefault(JMeter.HTTP_PROXY_PASS,""); protected static final String PROXY_DOMAIN = JMeterUtils.getPropDefault("http.proxyDomain",""); protected static final InetAddress localAddress; protected static final String LOCALHOST; protected static final Set<String> nonProxyHostFull = new HashSet<>(); protected static final List<String> nonProxyHostSuffix = new ArrayList<>(); protected static final int NON_PROXY_HOST_SUFFIX_SIZE; protected static final int CPS_HTTP = JMeterUtils.getPropDefault("httpclient.socket.http.cps", 0); protected static final int CPS_HTTPS = JMeterUtils.getPropDefault("httpclient.socket.https.cps", 0); protected static final boolean USE_LOOPBACK = JMeterUtils.getPropDefault("httpclient.loopback", false); protected static final String HTTP_VERSION = JMeterUtils.getPropDefault("httpclient.version", "1.1"); // -1 means not defined protected static final int SO_TIMEOUT = JMeterUtils.getPropDefault("httpclient.timeout", -1); // Control reuse of cached SSL Context in subsequent iterations protected static final boolean USE_CACHED_SSL_CONTEXT = JMeterUtils.getPropDefault("https.use.cached.ssl.context", true);//$NON-NLS-1$ static { if(!StringUtils.isEmpty(JMeterUtils.getProperty("httpclient.timeout"))) { //$NON-NLS-1$ log.warn("You're using property 'httpclient.timeout' that will soon be deprecated for HttpClient3.1, you should either set " + "timeout in HTTP Request GUI, HTTP Request Defaults or set http.socket.timeout in httpclient.parameters"); } if (NONPROXY_HOSTS.length() > 0) { StringTokenizer s = new StringTokenizer(NONPROXY_HOSTS,"|");// $NON-NLS-1$ while (s.hasMoreTokens()) { String t = s.nextToken(); if (t.indexOf('*') ==0) {// e.g. *.apache.org // $NON-NLS-1$ nonProxyHostSuffix.add(t.substring(1)); } else { nonProxyHostFull.add(t);// e.g. www.apache.org } } } NON_PROXY_HOST_SUFFIX_SIZE=nonProxyHostSuffix.size(); InetAddress inet = null; String localHostOrIP = JMeterUtils.getPropDefault("httpclient.localaddress",""); // $NON-NLS-1$ if (localHostOrIP.length() > 0) { try { inet = InetAddress.getByName(localHostOrIP); log.info("Using localAddress {}", inet.getHostAddress()); } catch (UnknownHostException e) { log.warn(e.getLocalizedMessage()); } } else { // Get hostname localHostOrIP = JMeterUtils.getLocalHostName(); } localAddress = inet; LOCALHOST = localHostOrIP; log.info("Local host = {}", LOCALHOST); } protected HTTPHCAbstractImpl(HTTPSamplerBase testElement) { super(testElement); } protected static boolean isNonProxy(String host){ return nonProxyHostFull.contains(host) || isPartialMatch(host); } protected static boolean isPartialMatch(String host) { for (int i=0;i<NON_PROXY_HOST_SUFFIX_SIZE;i++){ if (host.endsWith(nonProxyHostSuffix.get(i))) { return true; } } return false; } /** * Is a dynamic proxy defined? * * @param proxyHost the host to check * @param proxyPort the port to check * @return {@code true} iff both ProxyPort and ProxyHost are defined. */ protected boolean isDynamicProxy(String proxyHost, int proxyPort){ return !JOrphanUtils.isBlank(proxyHost) && proxyPort > 0; } /** * Is a static proxy defined? * * @param host to check against non-proxy hosts * @return {@code true} iff a static proxy has been defined. */ protected static boolean isStaticProxy(String host){ return PROXY_DEFINED && !isNonProxy(host); } /** * @param value String value to test * @return true if value is null or empty trimmed */ protected static boolean isNullOrEmptyTrimmed(String value) { return JOrphanUtils.isBlank(value); } }