yousuf
yousuf

Reputation: 23

HttpsURLConnection Failed on Second request

I am using HttpsURLConnection to connect client application. I am sending multiple requests for 1 user request(like login, dosearch and getResult).

It works fine as expected for First user's request(Server 1st request). but when for Second request code fails and thus facing multiple redirects.

When I start the local server for 1 request only it were working fine and remaining are failing and I have tried by below setting:

con.setRequestProperty("Connection", "close");
System.setProperty("https.proxyPort", "8888");
System.setProperty("http.keepAlive", "false");

I am able to establish the connection but the code which run for 1st time same code was failing there after.

Sample code:

URL url2 = new URL("client url");
    HttpsURLConnection con2 = (HttpsURLConnection) url2.openConnection();
    con2.setSSLSocketFactory(sc.getSocketFactory());

    CookieHandler.setDefault(new CookieManager());
    con2.setUseCaches(false);
    con2.setDefaultUseCaches(false);
    con2.setDoOutput(true);
    con2.setDoInput(true);
    con2.setReadTimeout(5000);
    con2.setRequestMethod("POST");
    con2.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0");
    con2.setRequestProperty("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    con2.setRequestProperty("Accept-Language","en-US,en;q=0.5");
    con2.setRequestProperty("Cache-Control","max-age=0");
    con2.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
    con2.setReadTimeout(6000);
    con2.setConnectTimeout(10000);
    con2.setRequestProperty("Connection", "close");

    List<NameValuePair> nameValuePairsLogin = new ArrayList<NameValuePair>();

    nameValuePairsLogin.add(new BasicNameValuePair("username", "username"));
    nameValuePairsLogin.add(new BasicNameValuePair("password", "password"));
    // some other inputs

    String params=Utils.getQuery(nameValuePairsLogin).toString();
    byte[] postDataBytes = params.toString().getBytes("UTF-8");
    con2.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
    con2.setInstanceFollowRedirects(false);

    DataOutputStream wr = new DataOutputStream(con2.getOutputStream());
    wr.write(postDataBytes);
    wr.flush();
    wr.close();

    boolean redirect = false;
    int status = con2.getResponseCode();

    if (status != HttpsURLConnection.HTTP_OK) {
        if (status == HttpsURLConnection.HTTP_MOVED_TEMP
                || status == HttpsURLConnection.HTTP_MOVED_PERM
                    || status == HttpsURLConnection.HTTP_SEE_OTHER)
            redirect = true;
    }

    System.out.println("Response Code ... " + status);
    if (redirect) {
        String newUrl = con2.getHeaderField("Location");
        String cookies = con2.getHeaderField("Set-Cookie");

        // open the new connnection again
        con2 = (HttpsURLConnection) new URL(newUrl).openConnection();
        con2.setSSLSocketFactory(sc.getSocketFactory());
        con2.setRequestProperty("Cookie", cookies);
        con2.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0");
        con2.setRequestProperty("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        con2.setRequestProperty("Accept-Language","en-US,en;q=0.5");
        //con2.setRequestProperty("Connection","keep-alive");
        con2.setRequestProperty("Cache-Control","max-age=0");
        con2.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
        con2.addRequestProperty("Referer", "Client URL");
        con2.setReadTimeout(6000);
        con2.setConnectTimeout(10000);
        con2.setRequestProperty("Connection", "close");
        con2.setUseCaches(false);
        con2.setDoOutput(true);
        con2.setDoInput(true);
        con2.setDefaultUseCaches(false);

        System.out.println("Redirect to URL : " + newUrl);
        DataOutputStream wr1 = new DataOutputStream(con2.getOutputStream());
        wr1.write(postDataBytes);
        wr1.flush();
        wr1.close();
    }



    String resonse2=Utils.toString(con2.getInputStream());

Utils.toString:

public static String toString(InputStream inputStream) throws IOException {


    String inputLine;
    BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
    StringBuffer response = new StringBuffer();

    while ((inputLine = in.readLine()) != null) {
        response.append(inputLine);
    }
    in.close();
    in=null;
    return response.toString();
}

like this am making multiple requests and creating different HttpsURLConnection for each request.

Thanks for the help in advance.

Upvotes: 0

Views: 409

Answers (2)

DHARMENDRA SINGH
DHARMENDRA SINGH

Reputation: 615

Each HttpURLConnection instance is used to make a single request. If you want to send multiple request create a method getHttpURLConnection() which gives new connection every time.

Upvotes: 1

Bejond
Bejond

Reputation: 1198

I think you might need to use HttpsURLConnectionImpl.getOutputStream().close(). Then try another request.

Upvotes: 0

Related Questions