On 27 February 2017 at 11:26, Philippe Mouawad <[email protected]> wrote: > On Mon, Feb 27, 2017 at 11:17 AM, sebb <[email protected]> wrote: > >> On 27 February 2017 at 07:57, <[email protected]> wrote: >> > Author: pmouawad >> > Date: Mon Feb 27 07:57:43 2017 >> > New Revision: 1784506 >> > >> > URL: http://svn.apache.org/viewvc?rev=1784506&view=rev >> > Log: >> > Bug 60778 - Http Java Impl does not show Authorization header in >> SampleResult even if it is sent >> > Bugzilla Id: 60778 >> > >> > Modified: >> > jmeter/trunk/build.xml >> > jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/ >> http/sampler/HTTPJavaImpl.java >> > jmeter/trunk/xdocs/changes.xml >> > >> > Modified: jmeter/trunk/build.xml >> > URL: http://svn.apache.org/viewvc/jmeter/trunk/build.xml?rev=1784 >> 506&r1=1784505&r2=1784506&view=diff >> > ============================================================ >> ================== >> > --- jmeter/trunk/build.xml (original) >> > +++ jmeter/trunk/build.xml Mon Feb 27 07:57:43 2017 >> > @@ -2739,6 +2739,13 @@ run JMeter unless all the JMeter jars ar >> > <param name="batchtest.jmx" value="Http4ImplPreemptiveBasi >> cAuth.jmx"/> >> > </antcall> >> > >> > + <antcall target="batchtest"> >> > + <param name="batchtest.name" value="Http4ImplPreemptiveBasi >> cAuth"/> >> > + <param name="batchtest.jmx" value="Http4ImplPreemptiveBasi >> cAuth.jmx"/> >> > + <param name="batchtest.variable" value="jmeter.httpsampler"/> >> > + <param name="batchtest.value" value="Java"/> >> > + </antcall> >> > + >> > <antcall target="batchtest"> >> > <param name="batchtest.name" value="TestKeepAlive"/> >> > <param name="batchtest.jmx" value="TestKeepAlive.jmx"/> >> > >> > Modified: jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/ >> http/sampler/HTTPJavaImpl.java >> > URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/http/ >> org/apache/jmeter/protocol/http/sampler/HTTPJavaImpl. >> java?rev=1784506&r1=1784505&r2=1784506&view=diff >> > ============================================================ >> ================== >> > --- >> > jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPJavaImpl.java >> (original) >> > +++ >> > jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPJavaImpl.java >> Mon Feb 27 07:57:43 2017 >> > @@ -26,6 +26,7 @@ import java.net.InetSocketAddress; >> > import java.net.Proxy; >> > import java.net.URL; >> > import java.net.URLConnection; >> > +import java.util.HashMap; >> > import java.util.List; >> > import java.util.Map; >> > import java.util.zip.GZIPInputStream; >> > @@ -63,7 +64,6 @@ public class HTTPJavaImpl extends HTTPAb >> > >> > static { >> > log.info("Maximum connection retries = {}", MAX_CONN_RETRIES); >> // $NON-NLS-1$ >> > - // Temporary copies, so can set the final ones >> > } >> > >> > private static final byte[] NULL_BA = new byte[0];// can share these >> > @@ -183,6 +183,9 @@ public class HTTPJavaImpl extends HTTPAb >> > // with the last request to an HTTP server. Instead, most >> browsers >> > // leave it to the server to close the connection after their >> > // timeout period. Leave it to the JMeter user to decide. >> > + // Ensure System property "" is set to true to allow headers >> >> Missing property name >> > Good catch , fixed > >> >> > + // such as "Host" and "Connection" to be passed through. >> > + // See http://bugs.java.com/bugdataba >> se/view_bug.do?bug_id=6996110 >> > if (getUseKeepAlive()) { >> > conn.setRequestProperty(HTTPConstants.HEADER_CONNECTION, >> HTTPConstants.KEEP_ALIVE); >> > } else { >> > @@ -193,7 +196,7 @@ public class HTTPJavaImpl extends HTTPAb >> > setConnectionHeaders(conn, u, getHeaderManager(), >> getCacheManager()); >> > String cookies = setConnectionCookie(conn, u, >> getCookieManager()); >> > >> > - setConnectionAuthorization(conn, u, getAuthManager()); >> > + Map<String, String> securityHeaders = >> setConnectionAuthorization(conn, u, getAuthManager()); >> > >> > if (method.equals(HTTPConstants.POST)) { >> > setPostHeaders(conn); >> > @@ -202,7 +205,7 @@ public class HTTPJavaImpl extends HTTPAb >> > } >> > >> > if (res != null) { >> > - res.setRequestHeaders(getConnectionHeaders(conn)); >> > + res.setRequestHeaders(getConnectionHeaders(conn, >> securityHeaders)); >> > res.setCookies(cookies); >> > } >> > >> > @@ -383,9 +386,10 @@ public class HTTPJavaImpl extends HTTPAb >> > * @param conn >> > * <code>HttpUrlConnection</code> which represents the >> URL >> > * request >> > + * @param securityHeaders Map of security Header or null >> > * @return the headers as a string >> > */ >> > - private String getConnectionHeaders(HttpURLConnection conn) { >> > + private String getConnectionHeaders(HttpURLConnection conn, >> Map<String, String> securityHeaders) { >> > // Get all the request properties, which are the headers set on >> the connection >> > StringBuilder hdrs = new StringBuilder(100); >> > Map<String, List<String>> requestHeaders = >> conn.getRequestProperties(); >> > @@ -402,6 +406,14 @@ public class HTTPJavaImpl extends HTTPAb >> > } >> > } >> > } >> > + if(securityHeaders != null) { >> > + for(Map.Entry<String, String> entry : >> securityHeaders.entrySet()) { >> > + hdrs.append(entry.getKey()) >> > + .append(": ") // $NON-NLS-1$ >> > + .append(entry.getValue()) >> > + .append("\n"); // $NON-NLS-1$ >> > + } >> > + } >> > return hdrs.toString(); >> > } >> > >> > @@ -417,14 +429,20 @@ public class HTTPJavaImpl extends HTTPAb >> > * @param authManager >> > * the <code>AuthManager</code> containing all the >> cookies for >> > * this <code>UrlConfig</code> >> > + * @return String Authorization header value or null if not set >> > */ >> > - private void setConnectionAuthorization(HttpURLConnection conn, >> URL u, AuthManager authManager) { >> > + private Map<String, String> >> > setConnectionAuthorization(HttpURLConnection >> conn, URL u, AuthManager authManager) { >> > if (authManager != null) { >> > Authorization auth = authManager.getAuthForURL(u); >> > if (auth != null) { >> > - >> > conn.setRequestProperty(HTTPConstants.HEADER_AUTHORIZATION, >> auth.toBasicHeader()); >> > + String headerValue = auth.toBasicHeader(); >> > + >> > conn.setRequestProperty(HTTPConstants.HEADER_AUTHORIZATION, >> headerValue); >> > + Map<String, String> map = new HashMap<>(1); >> > + map.put(HTTPConstants.HEADER_AUTHORIZATION, >> headerValue); >> > + return map; >> > } >> > } >> > + return null; >> >> It'a almost always better to return an empty array or collection >> instead of null. >> Simplifies the code as callers don't need to check for null. >> > I usually agree with such rule but not here as it will result in a lot of > object creation for nothing.
Use Collections.emptyMap() which returns a pointer to a shared immutable empty map. >> >> > } >> > >> > /** >> > >> > Modified: jmeter/trunk/xdocs/changes.xml >> > URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml? >> rev=1784506&r1=1784505&r2=1784506&view=diff >> > ============================================================ >> ================== >> > --- jmeter/trunk/xdocs/changes.xml [utf-8] (original) >> > +++ jmeter/trunk/xdocs/changes.xml [utf-8] Mon Feb 27 07:57:43 2017 >> > @@ -243,6 +243,7 @@ JMeter now requires Java 8. Ensure you u >> > <li><bug>60690</bug>Default values for >> "httpclient4.validate_after_inactivity" and "httpclient4.time_to_live" >> which are equal to each other makes validation useless</li> >> > <li><bug>60758</bug>HTTP(s) Test Script Recorder : Number request >> may generate duplicate numbers. Contributed by Ubik Load Pack (support at >> ubikloadpack.com)</li> >> > <li><bug>56939</bug>Parameters are not passed with OPTIONS HTTP >> Request</li> >> > + <li><bug>60778</bug>Http Java Impl does not show Authorization >> header in SampleResult even if it is sent</li> >> > </ul> >> > >> > <h3>Other Samplers</h3> >> > >> > >> > > > > -- > Cordialement. > Philippe Mouawad.
