Client performing HTTP POST times out prematurely

59 views Asked by At

I am writing an HTTP client that posts a file to a service using Restlet 2.4.0. The POST works, but after 60 seconds the client throws an exception:

Exception: class org.restlet.resource.ResourceException : Communication Error (1001) - The connector failed to complete the communication with the server

The server properly processes the data, and takes about 200 seconds, despite the client timing out.

I want instead for the client to wait for the data to be processed. I also want to know that the operation actually completed successfully so if it fails it can be re-tried.

What changes are needed on the client so that it does not time out prematurely?

Test Code:


package edu.umro.RestletUtil;

import org.restlet.Context;
import org.restlet.data.ChallengeResponse;
import org.restlet.data.ChallengeScheme;
import org.restlet.data.MediaType;
import org.restlet.ext.html.FormData;
import org.restlet.ext.html.FormDataSet;
import org.restlet.representation.FileRepresentation;
import org.restlet.resource.ClientResource;

import java.io.File;

/**
 * Test HTTP POST using Restlet version 2.4.0
 */
public class Poster {
    public static void main(String[] args) {
        System.out.println("Starting ...");

        String userId = "myId";
        String password = "somePassword";
        String url = "https://localhost/run/BBbyCBCT_1?Run=Run&AutoUpload=true";
        File file = new File("C:\\tmp\\29BR_cbct.zip");

        ChallengeResponse challengeResponse = new ChallengeResponse(ChallengeScheme.HTTP_BASIC, userId, password);

        Context clientContext = new Context();
        clientContext.getAttributes().put("sslContextFactory", new TrustingSslContextFactory());
        ClientResource clientResource = new ClientResource(clientContext, url);

        clientResource.setChallengeResponse(challengeResponse);

        FileRepresentation entity = new FileRepresentation(file, MediaType.APPLICATION_ZIP);
        FormDataSet formDataSet = new FormDataSet();
        formDataSet.getEntries().add(new FormData("FileTag", entity));
        formDataSet.setMultipart(true);

        long start = System.currentTimeMillis();
        try {
            clientResource.post(formDataSet, MediaType.MULTIPART_FORM_DATA);
            System.out.println("Yay, it worked!!!!!!!!");
        } catch (Exception ex) {
            System.out.println("Failure :(");
            System.out.println("Exception: " + ex.getClass() + " : " + ex.getMessage());
            ex.printStackTrace();
        }

        long elapsed = System.currentTimeMillis() - start;
        System.out.println("Done.  Elapsed time of POST in ms: " + elapsed);

        System.out.println("Exiting.");
        System.exit(0);
    }
}

Output:

Starting ...
Starting the Apache HTTP client
An error occurred during the communication with the remote HTTP server.

java.net.SocketTimeoutException: Read timed out
    at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
    at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
    at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
    at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
    at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966)
    at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:478)
    at java.base/sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:472)
    at java.base/sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:70)
    at java.base/sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1461)
    at java.base/sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:1065)
    at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:160)
    at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:84)
    at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:273)
    at org.apache.http.impl.conn.LoggingSessionInputBuffer.readLine(LoggingSessionInputBuffer.java:116)
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:140)
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57)
    at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:260)
    at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:283)
    at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:251)
    at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:223)
    at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:271)
    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123)
    at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:682)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:486)
    at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57)
    at org.restlet.ext.httpclient.internal.HttpMethodCall.sendRequest(HttpMethodCall.java:339)
    at org.restlet.engine.adapter.ClientAdapter.commit(ClientAdapter.java:105)
    at org.restlet.engine.adapter.HttpClientHelper.handle(HttpClientHelper.java:119)
    at org.restlet.Client.handle(Client.java:153)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.resource.ClientResource.handle(ClientResource.java:1122)
    at org.restlet.resource.ClientResource.handleOutbound(ClientResource.java:1208)
    at org.restlet.resource.ClientResource.handle(ClientResource.java:1077)
    at org.restlet.resource.ClientResource.handle(ClientResource.java:1095)
    at org.restlet.resource.ClientResource.post(ClientResource.java:1498)
    at edu.umro.RestletUtil.Poster.main(Poster.java:41)
org.restlet.resource.ResourceException: Communication Error (1001) - The connector failed to complete the communication with the server
    at org.restlet.resource.ClientResource.doError(ClientResource.java:621)
    at org.restlet.resource.ClientResource.doError(ClientResource.java:606)
    at org.restlet.resource.ClientResource.handleInbound(ClientResource.java:1185)
    at org.restlet.resource.ClientResource.handle(ClientResource.java:1078)
    at org.restlet.resource.ClientResource.handle(ClientResource.java:1095)
    at org.restlet.resource.ClientResource.post(ClientResource.java:1498)
    at edu.umro.RestletUtil.Poster.main(Poster.java:41)
Caused by: java.net.SocketTimeoutException: Read timed out
    at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
    at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
    at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
    at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
    at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966)
    at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:478)
    at java.base/sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:472)
    at java.base/sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:70)
    at java.base/sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1461)
    at java.base/sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:1065)
    at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:160)
    at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:84)
    at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:273)
    at org.apache.http.impl.conn.LoggingSessionInputBuffer.readLine(LoggingSessionInputBuffer.java:116)
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:140)
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57)
    at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:260)
    at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:283)
    at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:251)
    at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:223)
    at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:271)
    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123)
    at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:682)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:486)
    at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57)
    at org.restlet.ext.httpclient.internal.HttpMethodCall.sendRequest(HttpMethodCall.java:339)
    at org.restlet.engine.adapter.ClientAdapter.commit(ClientAdapter.java:105)
    at org.restlet.engine.adapter.HttpClientHelper.handle(HttpClientHelper.java:119)
    at org.restlet.Client.handle(Client.java:153)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.resource.ClientResource.handle(ClientResource.java:1122)
    at org.restlet.resource.ClientResource.handleOutbound(ClientResource.java:1208)
    at org.restlet.resource.ClientResource.handle(ClientResource.java:1077)
    ... 3 more
Failure :(
Exception: class org.restlet.resource.ResourceException : Communication Error (1001) - The connector failed to complete the communication with the server
Done.  Elapsed time of POST in ms: 60978
Exiting.

Process finished with exit code 0
0

There are 0 answers