Home » Android » android – setRequestProperty throwing java.lang.IllegalStateException: Cannot set request property after connection is made

android – setRequestProperty throwing java.lang.IllegalStateException: Cannot set request property after connection is made

Posted by: admin May 14, 2020 Leave a comment

Questions:

I am getting java.lang.IllegalStateException:

java.lang.IllegalStateException: Cannot set request property after connection is made error when setRequestProperty method is called after
url.openConnection();

Here is what i am trying:

URL url = new URL("https://49.205.102.182:7070/obsplatform/api/v1/mediadevices/545b801ce37e69cc");
         urlConnection = (HttpsURLConnection) url
        .openConnection();
urlConnection.setRequestProperty("Content-Type","application/json");

any suggestions please? Thanks in advance.

How to&Answers:

This could usually happen if you have in the debug watchers some calls such as conn.getResponseCode() (or anything that perform a request while it is still incomplete).
This causes, that during debug, a request is performed by the debugger watcher, before having properly set you request, and then it becomes invalid.

Answer:

I only have this issue while in debugging mode,
Run without debugging (You can print logs) everything should work fine

Answer:

The obvious thing is to think that you need to add properties before calling open on the URL. this however is not the case. i have seen many samples of settings being set AFTER url has been open (as counter intuitive as that is).

the problem in my case is that i had conn.getResponseCode() added in my watch list. removed that and all good.

… tricky.

Answer:

please check below code

HttpURLConnection httpcon = (HttpURLConnection) ((new URL("a url").openConnection()));
httpcon.setDoOutput(true);
httpcon.setRequestProperty("Content-Type", "application/json");
httpcon.setRequestProperty("Accept", "application/json");
httpcon.setRequestMethod("POST");
httpcon.connect();

Answer:

I was getting the same exception on setRequestProperty("Range","byte=" + downloadedSize + "-") .
After adding connection.setChunkedStreamingMode(0); the issue disappeared

Answer:

I’m having the same issue.
I was observing this issue on Nexus 5. Code of my app constantly fails with the same exception (or its twin brother “cannot set request method ..”)

What I’ve observed that it happens if i leave phone for a while. One it starts failing it fails all the time – but if i restart phone/emulator it’s ok once again).

My suspicion is its either some bug in connection pooling on framework side, or somewhere in code resources are leaked.

Answer:

i found the problem it’s about ordering the code, if you are trying to add header and post parameters both, it’s important to be careful about this

HttpURLConnection connection = (HttpURLConnection) urlConnection;

////        Add Request Headers
for (NameValuePair nvp :
         request[0].getHeaderParams()) {
     connection.setRequestProperty(nvp.getName(),nvp.getValue());
     }
// done

connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestMethod("POST");
////         Add Post Parameters
OutputStream outputStream = urlConnection.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
List<NameValuePair> params = new ArrayList<>(request[0].getPostParams());
bufferedWriter.write(getQuery(params));

// done
connection.setConnectTimeout(3000);
connection.setReadTimeout(3000);
bufferedWriter.flush();
bufferedWriter.close();
outputStream.flush();
outputStream.close();
connection.connect();

in here, i have added header parameters then set setDoInput and setDoOutput then setRequestMethod and finally you can add POST parameters.
i don’t know what is wrong with setRequestMethod but i think its preparing the connection by opening it or something and that’s why it throws exception

Answer:

not invoke setRequestProperty after write byte to OutputStream.

OutputStream os = connection.getOutputStream();
os.write("k=v".getBytes());
os.close();

you should invoke setRequestProperty above the code

Answer:

To avoid the error:

java.lang.IllegalStateException: Cannot set request property after connection is made

We have to check the connection response before access the request header fields :

URL url = new URL("https://49.205.102.182:7070/obsplatform/api/v1/mediadevices/545b801ce37e69cc");
     urlConnection = (HttpsURLConnection) url
    .openConnection();

//Check connection
if(urlConnection.getResponseCode() == 200/*Successful*/) {      
   urlConnection.setRequestProperty("Content-Type","application/json");
  ...
  ...    
 }