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>




Reply via email to