You are viewing a plain text version of this content. The canonical link for it is here.
Posted to httpclient-users@hc.apache.org by Oleg Kalnichevski <ol...@apache.org> on 2008/10/07 14:23:28 UTC
Re: Getting at the Location URI header value in the
ClientParamStacks
On Wed, 2008-10-01 at 08:26 -0700, mars_man wrote:
> Basically, my java client will be sending an HTTPS request to an ASP site;
> that site gets the request, does what it needs to do and then redirects back
> using a returnURL that is part of the initial HTTPS request. They then tack
> on the result message to the return URL. For example: if the https request
> is https://xyz.com/add.asp?name=sav&returnURL=http://mysite.com. The
> return URL from the xyz.com site is http://mysite.com?resultCode=success.
>
> All I want to do is follow the redirection and get at that resultCode value
> and I had this working with httpclients 3.0 but since i could not get the
> SSL handshale working, i decided to look in to the HttpClients 4.0. I have
> the SSL handshake issue resolved but can't figure out how to get at that
> resultCode namevalue pair. I see the returnURI in the Location header field
> in the ClientParamStacks in the Wire logs but I can't figure out how to get
> at that field. I have tried looking at the request, response and the
> httpentity objects (header values and other objects) but can't find it
> there.....
>
> My code is:
> DefaultHttpClient httpclient = new DefaultHttpClient();
> HttpHost proxy =
> new HttpHost(config.getProperty("proxy"),
> new Integer(config.getProperty("port")).intValue(),
> "http");
> httpclient.getParams().setParameter(
> ConnRoutePNames.DEFAULT_PROXY, proxy);
>
> httpclient.getParams().setBooleanParameter(
> ClientPNames.HANDLE_REDIRECTS, true);
>
> //read the emisare keystore
> KeyStore trustStore =
> KeyStore.getInstance(KeyStore.getDefaultType());
> trustStore.load(ReadFileUtil.getStream("/myKeystore.jks"),
> "changeit".toCharArray());
>
> //set up an SSLSicketFactory
> SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);
> Scheme sch = new Scheme("https", socketFactory, 443);
> httpclient.getConnectionManager().getSchemeRegistry().register(sch);
>
> HttpGet httpget = new HttpGet(emisareURL);
> System.out.println("executing request" + httpget.getRequestLine());
>
> HttpResponse response = httpclient.execute(httpget);
> HttpEntity entity = response.getEntity();
>
> httpclient.getParams();
>
> Header[] headers = response.getAllHeaders();
> for (int i = 0; i < headers.length; i++)
> {
> System.out.println(headers[i].getName() + " : " +
> headers[i].getValue());
> }
>
> ---------------------------
> the older code that i had working with http clients 3.01 is
>
> HttpClient client = new HttpClient();
> GetMethod method = new GetMethod();
> try
> {
> method.setURI(new URI(myURL, false));
>
> method.setFollowRedirects(true);
>
> //make the call
> HostConfiguration hostConfig = new HostConfiguration();
> hostConfig.setProxy(config.getProperty("proxy"),
> new Integer(config.getProperty("port")).intValue());
>
> hostConfig.setHost(targethost, sslPort, myhttps);
>
> client.setHostConfiguration(hostConfig);
>
> int statusCode = client.executeMethod(method);
>
> if
> ((statusCode != HttpStatus.SC_OK))
> {
> throw new MyServiceException(
> config.getProperty("SERVICE_ERROR_MSG"));
> }
> else
> {
> String returnedQueryString =
> URLDecoder.decode(
> method.getQueryString(),
> "UTF-8").replaceAll("%20", " ");
>
> logger.logDebug("returnedQueryString = " +
> returnedQueryString);
>
> int totalLen = returnedQueryString.length();
> int resultIndex = returnedQueryString.indexOf("result");
> returnMsg = returnedQueryString.substring(
> resultIndex + RESULT_LENGTH, totalLen).
> replaceAll(" ", "_");
> logger.logDebug("emisareMsg = " + returnMsg);
>
>
> logger.logDebug(config.getProperty(returnMsg.trim()));
> returnMsg = config.getProperty(returnMsg.trim());
> }
> ---------------
> The return code from the external site ended up in the querystring attribute
> of the method object and i could parse it to get what i needed.
>
> Like I mentioned I could not get the SSL working using 3.0 (with my
> implementation of SecureSocketProtocolFactory) till I switched to 4.0 but in
> 4.0, I can't figure out how to get at the return URI.
>
> I am porting over an ASP app to Java and in the previous world, this https
> communication was ASP page to ASP page but in the
> new enrvironment it is going to be java client to ASP page. Whatever the ASP
> returns back to us, we are not going to display it anywhere; we just need to
> get
> at the name-value parameter of the return URL.
>
> Any help in getting this going using httpclient 4.0 will be greatly
> appreaciated.
>
> Thanks in advance.
Sorry for responding so late. I just came back from vacation.
There are two ways of obtaining the redirect location with HttpClient
4.0
(1) by providing a custom redirect handler
(2) by getting hold of the executed request object from the execution
context
----
DefaultHttpClient httpclient = new DefaultHttpClient(params);
httpclient.setRedirectHandler(new DefaultRedirectHandler() {
@Override
public URI getLocationURI(
HttpResponse response,
HttpContext context) throws ProtocolException {
URI location = super.getLocationURI(response, context);
System.out.println(location); // method 1
return location;
}
});
HttpContext context = new BasicHttpContext();
HttpGet httpget = new HttpGet("http://localhost:8080");
HttpResponse response = httpclient.execute(httpget, context);
HttpUriRequest request = (HttpUriRequest)
context.getAttribute(ExecutionContext.HTTP_REQUEST);
System.out.println(request.getURI()); // method 2
---
Hope this helps
Oleg
---------------------------------------------------------------------
To unsubscribe, e-mail: httpclient-users-unsubscribe@hc.apache.org
For additional commands, e-mail: httpclient-users-help@hc.apache.org