apache http client org.apache.http.NoHttpResponseException: The target server failed to respond

39,818

I went through the links from here and got to this answer: get NoHttpResponseException for load testing

That set me on the right track. To update the answer a bit here is the solution using the current http-client 4.5 API:

private final HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(createHttpClient());

private CloseableHttpClient createHttpClient() {
    return HttpClients.custom().setRetryHandler((exception, executionCount, context) -> {
            if (executionCount > 3) {
                LOGGER.warn("Maximum tries reached for client http pool ");
                return false;
            }
            if (exception instanceof org.apache.http.NoHttpResponseException) {
                LOGGER.warn("No response from server on " + executionCount + " call");
                return true;
            }
            return false;
        }).build();
}

I also use spring-web there so I used the client as a parameter for RestTemplate factory since I want it to be used in the RestTemplate.

Share:
39,818
Waqas Ali
Author by

Waqas Ali

Updated on July 09, 2022

Comments

  • Waqas Ali
    Waqas Ali almost 2 years

    I am using apache http client to test my WS. I have write a get WS in jersey. URL for this WS is

    http://localhost:8080/mobilestore/rest/sysgestockmobilews/getinventory?xml=dataString
    

    to call this WS using url i have write a method which is as follow

    public static void getInventory(String input)
            throws ClientProtocolException, IOException {
    
        System.out.println(input);
        String url = URL + "getinventory";
        HttpClient client = new DefaultHttpClient();
    
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
        nameValuePairs.add(new BasicNameValuePair("xml", input));
        String paramString = URLEncodedUtils.format(nameValuePairs, "utf-8");
        url += "?" + paramString;
        System.out.println(url);
        HttpGet request = new HttpGet(url);
        HttpResponse response = client.execute(request);
        BufferedReader rd = new BufferedReader(new InputStreamReader(response
                .getEntity().getContent()));
    
        String line = "";
        while ((line = rd.readLine()) != null) {
            System.out.println(line);
        }
    
    }
    

    Now when i run the program and pass the url to this function i get exception at the line

    HttpResponse response = client.execute(request);
    

    Exception is as follow

    Aug 14, 2013 9:31:50 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute
    INFO: I/O exception (org.apache.http.NoHttpResponseException) caught when processing         request: The target server failed to respond
    Aug 14, 2013 9:31:50 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute
    INFO: Retrying request
    Aug 14, 2013 9:31:50 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute
    INFO: I/O exception (org.apache.http.NoHttpResponseException) caught when processing   request: The target server failed to respond
    Aug 14, 2013 9:31:50 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute
    INFO: Retrying request
    Aug 14, 2013 9:31:50 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute
    INFO: I/O exception (org.apache.http.NoHttpResponseException) caught when processing      request: The target server failed to respond
    Aug 14, 2013 9:31:50 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute
    INFO: Retrying request
    Exception in thread "main" org.apache.http.NoHttpResponseException: The target server failed to respond
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:95)
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:62)
    at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:254)
    at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:289)
    at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:252)
    at org.apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseHeader(ManagedClientConnectionImpl.java:191)
    at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:300)
    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:127)
    at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:715)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:520)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
    at    org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784)
    at com.tainosystems.http.client.TestWs.getInventory(TestWs.java:66)
    at com.tainosystems.http.client.TestWs.main(TestWs.java:47)
    

    Now if i use the WS url and hit it using any browser i get the expected result but i want to know what is wrong with my apache http client code..