AsyncTask - java.net.SocketException: Connection reset - android

I have an AsyncTask to fetch JSON data from a DB on my server. It works well normally but is failing sometimes with the below error. It seems like this happens when I keep the app idle but open for some time and then make a request.
doInBackground Method
try {
URL url = new URL(url_get_initial_posts);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setDoOutput(true);
OutputStream outputStream = httpURLConnection.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream,"UTF-8"));
String data_string_language = URLEncoder.encode("selected_language","UTF-8")+"="+URLEncoder.encode(arg_language,"UTF-8")
+"&"+URLEncoder.encode("app_time","UTF-8")+"="+URLEncoder.encode(String.valueOf(arg_app_time),"UTF-8");
bufferedWriter.write(data_string_language);
bufferedWriter.flush();
bufferedWriter.close();
outputStream.close();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder = new StringBuilder();
while ((JSON_INITIAL_POST = bufferedReader.readLine()) != null) {
stringBuilder.append(JSON_INITIAL_POST + "\n");
}
bufferedReader.close();
inputStream.close();
httpURLConnection.disconnect();
return stringBuilder.toString().trim();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
This line in the error
W/System.err: at com.indiparent.android.indiparent.PostTab$BackgroundJSONPosts.doInBackground(PostTab.java:343)
links to
InputStream inputStream = httpURLConnection.getInputStream();
Error
W/System.err: java.net.SocketException: Connection reset
W/System.err: at java.net.SocketInputStream.read(SocketInputStream.java:209)
W/System.err: at java.net.SocketInputStream.read(SocketInputStream.java:139)
W/System.err: at com.android.okhttp.okio.Okio$2.read(Okio.java:136)
W/System.err: at com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:211)
W/System.err: at com.android.okhttp.okio.RealBufferedSource.indexOf(RealBufferedSource.java:306)
W/System.err: at com.android.okhttp.okio.RealBufferedSource.indexOf(RealBufferedSource.java:300)
W/System.err: at com.android.okhttp.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:196)
W/System.err: at com.android.okhttp.internal.http.Http1xStream.readResponse(Http1xStream.java:186)
W/System.err: at com.android.okhttp.internal.http.Http1xStream.readResponseHeaders(Http1xStream.java:127)
W/System.err: at com.android.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:737)
W/System.err: at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:609)
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:471)
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:407)
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:244)
W/System.err: at com.indiparent.android.indiparent.PostTab$BackgroundJSONPosts.doInBackground(PostTab.java:343)
W/System.err: at com.indiparent.android.indiparent.PostTab$BackgroundJSONPosts.doInBackground(PostTab.java:308)
W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:333)
W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:266)
W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
W/System.err: at java.lang.Thread.run(Thread.java:764)
Extra Info - This is not the only Asynctask in the application. There are more in other activities and fragments. For example - if AsynckTask of Activity 2 throws this error then if I come back to Activity 1 then its AsyncTask also does not work.
Am I supposed to do something here or on the server side? Appreciate any help here.

Related

How to resolve SSL Handshake failure between Android app and Dropwizard server

I am trying to make an HTTP request from an Android app to a Dropwizard server that I have created, and am seeing an SSL handshake failure due to WRONG_VERSION_NUMBER. How do I make them work together?
As far as SSL or other authentication goes, I am using default technologies for both Dropwizard and Android--haven't configured anything for either. I tried setting different protocols on the server with JVM arguments
-Dhttps.protocols=TLSv1.2,TLSv1.1,TLSv1
But that didn't seem to make any difference. Since I haven't set anything, I don't know what each side is using by default.
This is how I am making the connection inside my app:
private class ScanRetreiver extends AsyncTask<String, Void, String> {
#Override
public String doInBackground(String... args) {
String resultString = null;
try {
//send GET request to REST API for list of items
URL url = new URL(args[0]);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
resultString = convertStreamToString(in);
} finally {
urlConnection.disconnect();
//display items--this means generating an arbitrary list of elements. should be fun
//optionally, elements can be expandable
}
} catch (Exception e) {
e.printStackTrace();
}
return resultString;
}
I see the Exception at the line where I try to call getInputStream on the urlConnection.
This is the error message that I see on the App side of things:
W/System.err: javax.net.ssl.SSLHandshakeException: Handshake failed
W/System.err: at com.android.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake(ConscryptFileDescriptorSocket.java:302)
W/System.err: at com.android.okhttp.internal.io.RealConnection.connectTls(RealConnection.java:1480)
W/System.err: at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:1424)
W/System.err: at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:1368)
W/System.err: at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:219)
W/System.err: at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:142)
W/System.err: at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:104)
W/System.err: at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:392)
W/System.err: at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:325)
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:470)
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:416)
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:244)
W/System.err: at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210)
W/System.err: at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:26)
W/System.err: at com.example.myfirstapp.ScanResultActivity$ScanRetreiver.doInBackground(ScanResultActivity.java:55)
W/System.err: at com.example.myfirstapp.ScanResultActivity$ScanRetreiver.doInBackground(ScanResultActivity.java:45)
W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:333)
W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:266)
W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
W/System.err: at java.lang.Thread.run(Thread.java:764)
W/System.err: Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x73e73f3908: Failure in SSL library, usually a protocol error
error:100000f7:SSL routines:OPENSSL_internal:WRONG_VERSION_NUMBER (external/boringssl/src/ssl/tls_record.cc:242 0x73f51bfecf:0x00000000)
W/System.err: at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
W/System.err: at com.android.org.conscrypt.NativeSsl.doHandshake(NativeSsl.java:383)
W/System.err: at com.android.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake(ConscryptFileDescriptorSocket.java:231)
... 21 more

AsyncTask OutputStream fails for few devices

I have two AsyncTasks in my fragment. First to load (AsyncTask1) the initial set of data and then another (AsyncTask2) to load subsequent data as the app is scrolled down.
Both the tasks work perfectly in the emulator (Pixel, Nexus devices). As I scroll the second task loads new data seamlessly.
But when I run the app on Samsung Note 4, Samsung A5 and one other device then AsyncTask1 works correctly but the AsyncTask2 stops executing after the below line. I tried it on a Moto phone and it worked properly.
OutputStream outputStream1 = httpURLConnection.getOutputStream();
Below is my doInBackground method of AsyncTask2
#Override
protected String doInBackground(Integer... args) {
String arg_item_number = String.valueOf((args[0]*5));
np_page = args[0];
String arg_language;
if (args[1]==1){
arg_language = "en";
}else{
arg_language = "hi";
}
try {
URL url1 = new URL(url_get_next_posts);
HttpURLConnection httpURLConnection = (HttpURLConnection) url1.openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setDoOutput(true);
OutputStream outputStream1 = httpURLConnection.getOutputStream();
BufferedWriter bufferedWriter1 = new BufferedWriter(new OutputStreamWriter(outputStream1,"UTF-8"));
String data_string_language1 = URLEncoder.encode("item_number","UTF-8")+"="+URLEncoder.encode(arg_item_number,"UTF-8")
+"&"+URLEncoder.encode("selected_language","UTF-8")+"="+URLEncoder.encode(arg_language,"UTF-8");
bufferedWriter1.write(data_string_language1);
bufferedWriter1.flush();
bufferedWriter1.close();
outputStream1.close();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder = new StringBuilder();
while ((JSON_NEXT_POST = bufferedReader.readLine()) != null) {
stringBuilder.append(JSON_NEXT_POST + "\n");
}
bufferedReader.close();
inputStream.close();
httpURLConnection.disconnect();
return stringBuilder.toString().trim();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
Error log
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
D/tag_item_count: 1
I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy#8bda7dd time:13839484
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
W/System.err: java.net.UnknownHostException: http:websitenname.com/script_url.php
W/System.err: at com.android.okhttp.internal.http.HttpEngine.createAddress(HttpEngine.java:1347)
W/System.err: at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:439)
W/System.err: at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:353)
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:476)
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:118)
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:249)
W/System.err: at com.app_name.android.app_name.PostTab$BackgroundNextPostsJSON.doInBackground(PostTab.java:374)
W/System.err: at com.app_name.android.app_name.PostTab$BackgroundNextPostsJSON.doInBackground(PostTab.java:347)
W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:295)
W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
W/System.err: at java.lang.Thread.run(Thread.java:818)
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
Can it be something related to the Android version running on the phone (Note 4 is running 6.0.1)? I have no clue what is wrong with the code as it actually works on emulator & Moto phone. Can the problem occur on other non-Samsung devices too?
In your stacktrace
http:websitenname.com/ is invalid URL due to it is missing double slash in the url scheme. Should be http://websitenname.com/ probably.
It worked on emulator and some devices probably because they have some undocumented improvements, and try to open even invalid URLs.

HttpURLConnection FileNotFoundException with Response Code 200

I'm trying to retrieve some videos with a GameId from Helix API of Twitch. Using a REST client I can retrieve the data and it works, but when I try it on android it won't work.
I get a response code 200, but when I try to access the InputStream I get a FileNotFoundException.
Here's the code I'm using:
HttpURLConnection urlConnection = null;
URL url = new URL(urlString);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestProperty("Client-ID", Configuration.TWITCH_CLIENT_ID);
urlConnection.setRequestMethod("GET");
urlConnection.connect();
System.out.println("ResponseCode: " + urlConnection.getResponseCode());
BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line + "\n");
}
br.close();
String jsonString = sb.toString();
System.out.println("JSON: " + jsonString);
return new JSONObject(jsonString);
Where Configuration.TWITCH_CLIENT_ID is my Twitch Client ID.
The output I get is:
01-16 02:19:19.658 21184-21242/ec.com.aurinow.aurinow I/System.out: ResponseCode: 200
01-16 02:19:20.133 21184-21242/ec.com.aurinow.aurinow W/System.err: java.io.FileNotFoundException: https://api.twitch.tv/helix/videos?game_id=9435
01-16 02:19:20.133 21184-21242/ec.com.aurinow.aurinow W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:238)
01-16 02:19:20.133 21184-21242/ec.com.aurinow.aurinow W/System.err: at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210)
01-16 02:19:20.133 21184-21242/ec.com.aurinow.aurinow W/System.err: at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java)
01-16 02:19:20.133 21184-21242/ec.com.aurinow.aurinow W/System.err: at java.net.URL.openStream(URL.java:470)
01-16 02:19:20.133 21184-21242/ec.com.aurinow.aurinow W/System.err: at ec.com.aurinow.aurinow.TwitchSearchActivity$RetrieveResponseTask.sendRequest(TwitchSearchActivity.java:272)
01-16 02:19:20.133 21184-21242/ec.com.aurinow.aurinow W/System.err: at ec.com.aurinow.aurinow.TwitchSearchActivity$RetrieveResponseTask.doInBackground(TwitchSearchActivity.java:233)
01-16 02:19:20.133 21184-21242/ec.com.aurinow.aurinow W/System.err: at ec.com.aurinow.aurinow.TwitchSearchActivity$RetrieveResponseTask.doInBackground(TwitchSearchActivity.java:229)
01-16 02:19:20.133 21184-21242/ec.com.aurinow.aurinow W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:295)
01-16 02:19:20.134 21184-21242/ec.com.aurinow.aurinow W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
01-16 02:19:20.134 21184-21242/ec.com.aurinow.aurinow W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
01-16 02:19:20.134 21184-21242/ec.com.aurinow.aurinow W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
01-16 02:19:20.134 21184-21242/ec.com.aurinow.aurinow W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
01-16 02:19:20.134 21184-21242/ec.com.aurinow.aurinow W/System.err: at java.lang.Thread.run(Thread.java:818)
Thank You Guys
EDIT: So I make it work using urlConnection.getInputStream() instead of url.openStream(). I don't why in this specific case it works like that.
You should get the response from the HttpURLConnection object. That is where the response will be.
The URL object is as the documentation puts it:
Class URL represents a Uniform Resource Locator, a pointer to a
"resource" on the World Wide Web.
So the URL only points to the resource you wish to retrieve from. The HttpURLConnection object is what actually contains the response after being pointed to the resource.
The HttpURLConnection object:
Each HttpURLConnection instance is used to make a single request but
the underlying network connection to the HTTP server...
So do this instead:
(new InputStreamReader(urlConnection.getInputStream()));
HttpURLConnection urlConnection = null;
URL url = new URL(urlString);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestProperty("Client-ID", Configuration.TWITCH_CLIENT_ID);
urlConnection.setRequestMethod("GET");
urlConnection.connect();
System.out.println("ResponseCode: " + urlConnection.getResponseCode());
BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line + "\n");
}
br.close();
String jsonString = sb.toString();
System.out.println("JSON: " + jsonString);
return new JSONObject(jsonString);

HTTP-request throws an exception FileNotFound

I have url: http://xxx.xxx.xxx.xxx:yyyy/api/Account/Register (ip:port). And in the browser I can get it like POST method without any problems. But Android throws an exception:
W/System.err: java.io.FileNotFoundException:
http://xxx.xxx.xxx.xxx:yyyy/api/Account/Register W/System.err: at
com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:186)
W/System.err: at
com.contedevel.reserves.utils.RestApi.signUp(RestApi.java:37)
W/System.err: at
com.contedevel.reserves.activity.RegisterActivity$UserRegistrationTask.doInBackground(RegisterActivity.java:415)
W/System.err: at
com.contedevel.reserves.activity.RegisterActivity$UserRegistrationTask.doInBackground(RegisterActivity.java:396)
W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:288)
W/System.err: at
java.util.concurrent.FutureTask.run(FutureTask.java:237) W/System.err:
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
W/System.err: at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
W/System.err: at
java.util.concurrent.ThreadPoolExecutor$Wo9191rker.run(ThreadPoolExecutor.java:587)
W/System.err: at java.lang.Thread.run(Thread.java:841)
A request method is POST 100%.
I create a new connection so:
URL url = new URL(urlStr);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
Write arguments so:
OutputStream os = connection.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
final String body = builder.toString();
writer.write(body);
writer.flush();
writer.close();
os.close();
What could be the problem?

SocketException . Sent to failed. Broken pipe

I want to to be able upload photos(blobs) my android application with back-end in Google App Engine.
I have done some online reading and i have deduced that i need the following.
(1) A serve let that creates the upload url (in the backend).
(2) A server let that handles response from(1) above such that i can get the blobkey of the posted image(from the response ).
(3) A class in my app(android client) to handle multi-data and invoke server let 1.
So i have serverlet 1
public class BlobUrlGet extends HttpServlet {
BlobstoreService blServ = BlobstoreServiceFactory.getBlobstoreService();
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
String blobUploadUrl = blServ.createUploadUrl("/blobupload");
resp.setStatus(HttpServletResponse.SC_OK);
resp.setContentType("text/plain");
PrintWriter out = resp.getWriter();
out.print(blobUploadUrl);
}
And serverlet 2.
public class BlobUpload extends HttpServlet {
BlobstoreService blobstoreService = BlobstoreServiceFactory
.getBlobstoreService();
#Override
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
try {
List<BlobKey> blobs = blobstoreService.getUploads(req).get("photo");
BlobKey blobKey = blobs.get(0);
ImagesService imagesService = ImagesServiceFactory.getImagesService();
ServingUrlOptions servingOptions = ServingUrlOptions.Builder.withBlobKey(blobKey);
String servingUrl = imagesService.getServingUrl(servingOptions);
resp.setStatus(HttpServletResponse.SC_OK);
resp.setContentType("application/json");
JSONObject json = new JSONObject();
json.put("servingUrl", servingUrl);
json.put("blobKey", blobKey.getKeyString());
PrintWriter out = resp.getWriter();
out.print(json.toString());
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Serverlet mappings
<servlet>
<servlet-name>BlobUrlGet</servlet-name>
<servlet-class>com.data.model.BlobUrlGet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>BlobUrlGet</servlet-name>
<url-pattern>/bloburlget</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>BlobUpload</servlet-name>
<servlet-class>com.data.model.BlobUpload</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>BlobUpload</servlet-name>
<url-pattern>/blobupload</url-pattern>
</servlet-mapping>
And here is the code to do multi-party posting.
public class MultipartyUtility {
private final String boundary;
private static final String LINE_FEED = "\r\n";
private HttpURLConnection httpConn;
private String charset;
private OutputStream outputStream;
private PrintWriter writer;
/**
* This constructor initializes a new HTTP POST request with content type
* is set to multipart/form-data
*
* #param requestURL
* #param charset
* #throws IOException
*/
public MultipartyUtility(String requestURL, String charset)
throws IOException {
this.charset = charset;
// creates a unique boundary based on time stamp
boundary = "===" + System.currentTimeMillis() + "===";
URL url = new URL(requestURL);
httpConn = (HttpURLConnection) url.openConnection();
httpConn.setUseCaches(false);
httpConn.setDoOutput(true); // indicates POST method
httpConn.setDoInput(true);
httpConn.setRequestProperty("Content-Type",
"multipart/form-data; boundary=" + boundary);
outputStream = httpConn.getOutputStream();
writer = new PrintWriter(new OutputStreamWriter(outputStream, charset),
true);
}
/**
* Adds a form field to the request
*
* #param name field name
* #param value field value
*/
public void addFormField(String name, String value) {
writer.append("--" + boundary).append(LINE_FEED);
writer.append("Content-Disposition: form-data; name=\"" + name + "\"")
.append(LINE_FEED);
writer.append("Content-Type: text/plain; charset=" + charset).append(
LINE_FEED);
writer.append(LINE_FEED);
writer.append(value).append(LINE_FEED);
writer.flush();
}
/**
* Adds a upload file section to the request
*
* #param fieldName name attribute in <input type="file" name="..." />
* #param uploadFile a File to be uploaded
* #throws IOException
*/
public void addFilePart(String fieldName, File uploadFile)
throws IOException {
String fileName = uploadFile.getName();
writer.append("--" + boundary).append(LINE_FEED);
writer.append(
"Content-Disposition: form-data; name=\"" + fieldName
+ "\"; filename=\"" + fileName + "\"")
.append(LINE_FEED);
writer.append(
"Content-Type: "
+ URLConnection.guessContentTypeFromName(fileName))
.append(LINE_FEED);
writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
writer.append(LINE_FEED);
writer.flush();
FileInputStream inputStream = new FileInputStream(uploadFile);
byte[] buffer = new byte[4096];
int bytesRead = -1;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush();
inputStream.close();
writer.append(LINE_FEED);
writer.flush();
}
/**
* Adds a header field to the request.
*
* #param name - name of the header field
* #param value - value of the header field
*/
public void addHeaderField(String name, String value) {
writer.append(name + ": " + value).append(LINE_FEED);
writer.flush();
}
/**
* Completes the request and receives response from the server.
*
* #return a list of Strings as response in case the server returned
* status OK, otherwise an exception is thrown.
* #throws IOException
*/
public List<String> finish() throws IOException {
List<String> response = new ArrayList<String>();
writer.append(LINE_FEED).flush();
writer.append("--" + boundary + "--").append(LINE_FEED);
writer.close();
// checks server's status code first
int status = httpConn.getResponseCode();
if (status == HttpURLConnection.HTTP_OK) {
BufferedReader reader = new BufferedReader(new InputStreamReader(
httpConn.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
response.add(line);
}
reader.close();
httpConn.disconnect();
} else {
throw new IOException("Server returned non-OK status: " + status);
}
return response;
}
}
Here is my uploading code. This where i believe i have failed . How do i get URL for passing the paramater to the multi-data utility class?
private class postImageAsncTask extends AsyncTask<String,Void,String>{
#Override
protected String doInBackground(String... params) {
try {
MultipartyUtility multipart= new MultipartyUtility("http://mayproject-id-2016.appspot.com/_ah/api/bloburlget", "UTF-8");
File myfile = new File(params[0]);
multipart.addHeaderField("User-Agent", "CodeJava");
multipart.addHeaderField("Test-Header", "Header-Value");
multipart.addFormField("description", "Cool Pictures");
multipart.addFormField("keywords", "Java,upload,Spring");
multipart.addFilePart("fileUpload", myfile);
List<String> response = multipart.finish();
System.out.println("SERVER REPLIED:");
for (String line : response) {
System.out.println(line);
}
return response.toString();
}catch(IOException e)
{
e.printStackTrace();
return null;
}
}
}
When i execute the code above i get the error below.
58:33.581 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: java.net.SocketException: sendto failed: EPIPE (Broken pipe)
09-18 14:58:33.607 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:586)
09-18 14:58:33.608 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at libcore.io.IoBridge.sendto(IoBridge.java:555)
09-18 14:58:33.608 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at java.net.PlainSocketImpl.write(PlainSocketImpl.java:513)
09-18 14:58:33.608 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:42)
09-18 14:58:33.608 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:271)
09-18 14:58:33.608 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at com.android.okio.Okio$1.write(Okio.java:70)
09-18 14:58:33.608 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at com.android.okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:116)
09-18 14:58:33.608 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at com.android.okio.RealBufferedSink.write(RealBufferedSink.java:44)
09-18 14:58:33.608 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at com.android.okhttp.internal.http.RetryableSink.writeToSocket(RetryableSink.java:77)
09-18 14:58:33.608 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at com.android.okhttp.internal.http.HttpConnection.writeRequestBody(HttpConnection.java:236)
09-18 14:58:33.609 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at com.android.okhttp.internal.http.HttpTransport.writeRequestBody(HttpTransport.java:77)
09-18 14:58:33.609 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:617)
09-18 14:58:33.609 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:388)
09-18 14:58:33.609 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:332)
09-18 14:58:33.609 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:500)
09-18 14:58:33.609 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at roadsafety.com.unra.unraroadsafety.MultipartyUtility.finish(MultipartyUtility.java:131)
09-18 14:58:33.609 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at roadsafety.com.unra.unraroadsafety.ReportIncident$postImageAsncTask.doInBackground(ReportIncident.java:605)
09-18 14:58:33.609 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at roadsafety.com.unra.unraroadsafety.ReportIncident$postImageAsncTask.doInBackground(ReportIncident.java:588)
09-18 14:58:33.610 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:288)
09-18 14:58:33.610 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
09-18 14:58:33.610 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
09-18 14:58:33.610 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
09-18 14:58:33.610 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
09-18 14:58:33.610 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at java.lang.Thread.run(Thread.java:818)
09-18 14:58:33.610 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: Caused by: android.system.ErrnoException: sendto failed: EPIPE (Broken pipe)
09-18 14:58:33.611 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at libcore.io.Posix.sendtoBytes(Native Method)
09-18 14:58:33.611 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at libcore.io.Posix.sendto(Posix.java:176)
09-18 14:58:33.611 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:278)
09-18 14:58:33.611 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: at libcore.io.IoBridge.sendto(IoBridge.java:553)
09-18 14:58:33.611 16069-17466/roadsafety.com.unra.unraroadsafety W/System.err: ... 22 more
My guess is that i am not properly calling the code for uploading. Especially the servelet Url i pass to the mulit-part utility class.
Any pointers to the right direction are eagerly awaited.
Ronald

Categories

Resources