Hi Oleg,

On Jun 24, 2010, at 6:54am, Oleg Kalnichevski wrote:

On Thu, 2010-06-24 at 05:42 -0700, Ken Krugler wrote:
On Jun 23, 2010, at 8:24pm, ctg3 wrote:


I am having an issue with HttpClient 4.01. When I try to access
www.google.com or any other website I get a "java.net.SocketException:
Permission denied: connect". There is no firewall or other software
blocking
Java and there are no proxies involved.

I'm assuming you've tried the same thing, and run into the same
problem, without your custom keep-alive and retry handlers, yes?

-- Ken


It is all very simple. The application does not have permissions to open
outgoing connections. This problem has nothing to do with HttpClient.
This looks like an OS level permission issue.

I believe you :) but I've never run into such a thing before for outgoing connections.

Are there common examples of configuration issues would cause such a problem?

Thanks,

-- Ken

PS - FWIW, I see that there's a bug logged against JDK7 that could cause this, though might be specific to using a VPN client that disabled IPv6:

http://forums.java.net/jive/thread.jspa?messageID=399654&tstart=0

Here is the stack trace:

2010-06-23 21:42:57,803 [main] DEBUG
org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager -
ThreadSafeClientConnManager.getConnection:
HttpRoute[{}->http://www.google.com], timeout = 15000
2010-06-23 21:42:57,806 [main] DEBUG
org.apache.http.impl.conn.tsccm.ConnPoolByRoute - Total connections
kept
alive: 0
2010-06-23 21:42:57,807 [main] DEBUG
org.apache.http.impl.conn.tsccm.ConnPoolByRoute - Total issued
connections:
0
2010-06-23 21:42:57,808 [main] DEBUG
org.apache.http.impl.conn.tsccm.ConnPoolByRoute - Total allocated
connection: 0 out of 5
2010-06-23 21:42:57,810 [main] DEBUG
org.apache.http.impl.conn.tsccm.ConnPoolByRoute - No free connections
[HttpRoute[{}->http://www.google.com]][null]
2010-06-23 21:42:57,810 [main] DEBUG
org.apache.http.impl.conn.tsccm.ConnPoolByRoute - Available
capacity: 2 out
of 2 [HttpRoute[{}->http://www.google.com]][null]
2010-06-23 21:42:57,811 [main] DEBUG
org.apache.http.impl.conn.tsccm.ConnPoolByRoute - Creating new
connection
[HttpRoute[{}->http://www.google.com]]
2010-06-23 21:42:58,126 [main] DEBUG
org.apache.http.impl.conn.DefaultClientConnection - Connection shut
down
2010-06-23 21:42:58,127 [main] DEBUG
org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager - Released
connection is not reusable.
2010-06-23 21:42:58,128 [main] DEBUG
org.apache.http.impl.conn.tsccm.ConnPoolByRoute - Releasing connection
[HttpRoute[{}->http://www.google.com]][null]
2010-06-23 21:42:58,128 [main] DEBUG
org.apache.http.impl.conn.tsccm.ConnPoolByRoute - Notifying no-one,
there
are no waiting threads
java.net.SocketException: Permission denied: connect
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(Unknown Source)
        at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
        at java.net.PlainSocketImpl.connect(Unknown Source)
        at java.net.SocksSocketImpl.connect(Unknown Source)
        at java.net.Socket.connect(Unknown Source)
        at
org
.apache
.http
.conn
.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java: 123)
        at
org
.apache
.http
.impl
.conn
.DefaultClientConnectionOperator
.openConnection(DefaultClientConnectionOperator.java:123)
        at
org
.apache .http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:
147)
        at
org
.apache
.http
.impl
.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:
108)
        at
org
.apache
.http
.impl
.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:
415)
        at
org
.apache
.http .impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:
641)
        at
org
.apache
.http .impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:
576)
        at
org
.apache
.http .impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:
554)

Here is my HttpClient code:

     HttpParams params = new BasicHttpParams();
      ConnManagerParams.setMaxTotalConnections(params, 5);
      ConnManagerParams.setTimeout(params, 15 * 1000);
      HttpConnectionParams.setStaleCheckingEnabled(params, true);
      HttpConnectionParams.setConnectionTimeout(params, 15 * 1000);
      HttpConnectionParams.setSoTimeout(params, 20 * 1000);
      HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);

      // Create and initialize scheme registry
      SchemeRegistry schemeRegistry = new SchemeRegistry();
      schemeRegistry.register(new Scheme("http",
PlainSocketFactory.getSocketFactory(), 80));
      schemeRegistry.register(new Scheme("https",
SSLSocketFactory.getSocketFactory(), 443));

      // Create an HttpClient with the ThreadSafeClientConnManager.
      // This connection manager must be used if more than one
thread will
      // be using the HttpClient.
      ClientConnectionManager cm = new
ThreadSafeClientConnManager(params,
schemeRegistry);

      httpclient = new DefaultHttpClient(cm, params);

      httpclient.setKeepAliveStrategy(new
ConnectionKeepAliveStrategy() {

          @Override
          public long getKeepAliveDuration(HttpResponse response,
HttpContext context) {
              // default keep alive for 100 seconds
              long keepAlive = 100 * 1000;

              // Honor 'keep-alive' header
              HeaderElementIterator it = new
BasicHeaderElementIterator(
response.headerIterator(HTTP.CONN_KEEP_ALIVE));
              while (it.hasNext()) {
                  HeaderElement he = it.nextElement();
                  String param = he.getName();
                  String value = he.getValue();
                  if (value != null &&
param.equalsIgnoreCase("timeout"))
{
                      try {
                          keepAlive = Long.parseLong(value) * 1000;
                          break;
                      } catch (NumberFormatException ex) {
                          if (log.isInfoEnabled()) {
                              log.warn("Unable to parse timeout
within
http header", ex);
                          }
                      }
                  }
              }
              // if you want custom keep-alive for a specific target
              //HttpHost target = (HttpHost)
context.getAttribute(ExecutionContext.HTTP_TARGET_HOST);

              return keepAlive;
          }
      });

      httpclient.setHttpRequestRetryHandler(new
HttpRequestRetryHandler()
{

          @Override
          public boolean retryRequest(
                  IOException exception,
                  int executionCount,
                  HttpContext context) {
              if (executionCount >= 5) {
                  // Do not retry if over max retry count
                  return false;
              }
              if (exception instanceof NoHttpResponseException) {
                  // Retry if the server dropped connection on us
                  return true;
              }
              if (exception instanceof SSLHandshakeException) {
                  // Do not retry on SSL handshake exception
                  return false;
              }
              HttpRequest request = (HttpRequest)
context.getAttribute(
                      ExecutionContext.HTTP_REQUEST);
              boolean idempotent = !(request instanceof
HttpEntityEnclosingRequest);
              if (idempotent) {
                  // Retry if the request is considered idempotent
                  return true;
              }
              return false;
          }
      });

And the get request code:

      final HttpGet httpget = new HttpGet(URL);
      HttpResponse response = null;
      HttpEntity entity = null;
      String entityContent = null;

      try {
          response = httpclient.execute(httpget);
          entity = response.getEntity();

          if (entity != null) {
              entity.consumeContent();
          }
      } catch (UnknownHostException ex) {
          httpget.abort();
          entityContent = null;
          if (log.isDebugEnabled()) {
              log.debug("Unable to reach host", ex);
          }
      } catch (IOException ex) {
          httpget.abort();
          entityContent = null;
          log.error("Unable to consume entity content", ex);
      } catch (RuntimeException ex) {
// In case of an unexpected exception you may want to abort
          // the HTTP request in order to shut down the underlying
          // connection and release it back to the connection
manager.
          httpget.abort();
          entityContent = null;
          log.error("Unexpected exception during runtime", ex);
      }
--
View this message in context: 
http://old.nabble.com/Connection-Shutdown-Immediately-on-HttpClient-4.01-tp28978594p28978594.html
Sent from the HttpClient-User mailing list archive at Nabble.com.


--------------------------------------------
Ken Krugler
+1 530-210-6378
http://bixolabs.com
e l a s t i c   w e b   m i n i n g





---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to