Le 08/08/2013 10:39, [email protected] a ecrit :
Author: sebb
Date: Thu Aug 8 10:39:14 2013
New Revision: 1511681
URL: http://svn.apache.org/r1511681
Log:
Support device in addition to source IP address
Support choice of IPv4 or IPv6; report error if selected interface is not found
Bugzilla Id: 54874
Modified:
jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPAbstractImpl.java
jmeter/trunk/xdocs/usermanual/component_reference.xml
Modified:
jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPAbstractImpl.java
URL:
http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPAbstractImpl.java?rev=1511681&r1=1511680&r2=1511681&view=diff
==============================================================================
---
jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPAbstractImpl.java
(original)
+++
jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPAbstractImpl.java
Thu Aug 8 10:39:14 2013
@@ -21,13 +21,14 @@ package org.apache.jmeter.protocol.http.
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.net.Inet4Address;
+import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.URL;
import java.net.UnknownHostException;
-import java.util.List;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.http.control.AuthManager;
@@ -144,7 +145,9 @@ public abstract class HTTPAbstractImpl i
* The prefix used to distiguish a device name from a host name.
* Host names cannot start with "/".
*/
- private static final String DEVICE_PREFIX = "/dev/";
+ private static final String DEVICE_PREFIX = "/";
This changes introduce an regression, /dev/eth0 don't works now.
+ private static final String IPV4 = "ipv4/";
+ private static final String IPV6 = "ipv6/";
/**
* Gets the IP source address (IP spoofing) if one has been provided.
@@ -157,19 +160,32 @@ public abstract class HTTPAbstractImpl i
final String ipSource = getIpSource();
if (ipSource.length() > 0) {
if (ipSource.startsWith(DEVICE_PREFIX)) {
- final String device =
ipSource.substring(DEVICE_PREFIX.length());
- NetworkInterface net = NetworkInterface.getByName(device);
+ String interfaceName =
ipSource.substring(DEVICE_PREFIX.length());
If the the ipSource is "/dev/eth0", the interfaceName become "dev/eth0"
and generate this error:
java.net.UnknownHostException: Cannot find interface dev/wlan0
at
org.apache.jmeter.protocol.http.sampler.HTTPAbstractImpl.getIpSourceAddress(HTTPAbstractImpl.java:184)
at
org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.setupRequest(HTTPHC4Impl.java:671)
at
org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:269)
at
org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:74)
at
org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1080)
at
org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1069)
at
org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:429)
at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:257)
at java.lang.Thread.run(Thread.java:679)
+ final Class<? extends InetAddress> ipClass;
+ if (interfaceName.startsWith(IPV4)) {
+ interfaceName = interfaceName.substring(IPV4.length());
+ ipClass = Inet4Address.class;
+ } else if (interfaceName.startsWith(IPV6)) {
+ interfaceName = interfaceName.substring(IPV6.length());
+ ipClass = Inet6Address.class;
+ } else {
+ ipClass = InetAddress.class;
+ }
+ NetworkInterface net =
NetworkInterface.getByName(interfaceName);
if (net != null) {
- List<InterfaceAddress> netAds =
net.getInterfaceAddresses();
- if (netAds.size() > 0) {
- return netAds.get(0).getAddress();
+ for (InterfaceAddress ia : net.getInterfaceAddresses()) {
+ final InetAddress inetAddr = ia.getAddress();
+ if (ipClass.isInstance(inetAddr)) {
+ return inetAddr;
+ }
}
+ throw new UnknownHostException("Interface " + interfaceName + "
does not have address of type " + ipClass.getSimpleName());
}
- return null;
+ throw new UnknownHostException("Cannot find interface " +
interfaceName);
}
return InetAddress.getByName(ipSource);
}
- return null;
+ return null; // did not want to spoof the IP address
}
/**
Modified: jmeter/trunk/xdocs/usermanual/component_reference.xml
URL:
http://svn.apache.org/viewvc/jmeter/trunk/xdocs/usermanual/component_reference.xml?rev=1511681&r1=1511680&r2=1511681&view=diff
==============================================================================
--- jmeter/trunk/xdocs/usermanual/component_reference.xml (original)
+++ jmeter/trunk/xdocs/usermanual/component_reference.xml Thu Aug 8 10:39:14
2013
@@ -323,9 +323,11 @@ and send HTTP/HTTPS requests for all ima
[Only for HTTP Request HTTPClient]
Override the default local IP address for this sample.
The JMeter host must have multiple IP addresses (i.e. IP aliases or
network interfaces).
- The value can be a host name, IP address, or a network interface device such as
"eth0" or "le0".
- In order to distinguish these from host names, the interface name must be
entered with the prefix "/dev/",
- for example "/dev/eth0" or "/dev/le0".
+ The value can be a host name, IP address, or a network interface device such as
"eth0" or "lo0".
+ In order to distinguish these from host names, the interface name must be
entered with the prefix "/",
+ for example "/eth0" or "/lo0". This will pick the first available
address for that interface which
+ this may be either IPV4 or IPV6. To select a specific IP protocol
version, prefix the interface name
+ with "/ipv4/" or "/ipv6/", for example "/ipv4/eth0" or "/ipv6/eth0"
If the property <b>httpclient.localaddress</b> is defined, that is
used for all HttpClient requests.
</property>
</properties>