On Thu, 2010-06-24 at 08:45 -0700, Ken Krugler wrote: > 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? >
It's been ages since I used Windows for anything other than starting Team Fortress, but I believe there was a user profile setting to deny a permission to open outgoing connections. I think the same can be done on Linux with SELinux or AppArmour. I am really just guessing here, but since the exception was thrown from a native method this must be an OS level issue. Cheers Oleg > 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] > --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
