コード例 #1
0
 private static final byte[] toByteArray(
     final HttpEntity entity, int maxContent, MutableBoolean trimmed) throws IOException {
   Args.notNull(entity, "Entity");
   final InputStream instream = entity.getContent();
   if (instream == null) {
     return null;
   }
   try {
     Args.check(
         entity.getContentLength() <= Integer.MAX_VALUE,
         "HTTP entity too large to be buffered in memory");
     int i = (int) entity.getContentLength();
     if (i < 0) {
       i = 4096;
     }
     final ByteArrayBuffer buffer = new ByteArrayBuffer(i);
     final byte[] tmp = new byte[4096];
     int l;
     int total = 0;
     while ((l = instream.read(tmp)) != -1) {
       // check whether we need to trim
       if (maxContent != -1 && total + l > maxContent) {
         buffer.append(tmp, 0, maxContent - total);
         trimmed.setValue(true);
         break;
       }
       buffer.append(tmp, 0, l);
       total += l;
     }
     return buffer.toByteArray();
   } finally {
     instream.close();
   }
 }
コード例 #2
0
 public final HttpHost getHopTarget(final int hop) {
   Args.notNegative(hop, "Hop index");
   final int hopcount = getHopCount();
   Args.check(hop < hopcount, "Hop index exceeds tracked route length");
   if (hop < hopcount - 1) {
     return this.proxyChain.get(hop);
   } else {
     return this.targetHost;
   }
 }
コード例 #3
0
  public void releaseConnection(
      final ManagedClientConnection conn, final long validDuration, final TimeUnit timeUnit) {
    Args.check(
        conn instanceof ConnAdapter,
        "Connection class mismatch, " + "connection not obtained from this manager");
    assertStillUp();

    if (log.isDebugEnabled()) {
      log.debug("Releasing connection " + conn);
    }

    final ConnAdapter sca = (ConnAdapter) conn;
    synchronized (sca) {
      if (sca.poolEntry == null) {
        return; // already released
      }
      final ClientConnectionManager manager = sca.getManager();
      Asserts.check(manager == this, "Connection not obtained from this manager");
      try {
        // make sure that the response has been read completely
        if (sca.isOpen() && (this.alwaysShutDown || !sca.isMarkedReusable())) {
          if (log.isDebugEnabled()) {
            log.debug("Released connection open but not reusable.");
          }

          // make sure this connection will not be re-used
          // we might have gotten here because of a shutdown trigger
          // shutdown of the adapter also clears the tracked route
          sca.shutdown();
        }
      } catch (final IOException iox) {
        if (log.isDebugEnabled()) {
          log.debug("Exception shutting down released connection.", iox);
        }
      } finally {
        sca.detach();
        synchronized (this) {
          managedConn = null;
          lastReleaseTime = System.currentTimeMillis();
          if (validDuration > 0) {
            connectionExpiresTime = timeUnit.toMillis(validDuration) + lastReleaseTime;
          } else {
            connectionExpiresTime = Long.MAX_VALUE;
          }
        }
      }
    }
  }
コード例 #4
0
 private HttpRoute(
     final HttpHost target,
     final InetAddress local,
     final List<HttpHost> proxies,
     final boolean secure,
     final TunnelType tunnelled,
     final LayerType layered) {
   Args.notNull(target, "Target host");
   this.targetHost = target;
   this.localAddress = local;
   if (proxies != null && !proxies.isEmpty()) {
     this.proxyChain = new ArrayList<HttpHost>(proxies);
   } else {
     this.proxyChain = null;
   }
   if (tunnelled == TunnelType.TUNNELLED) {
     Args.check(this.proxyChain != null, "Proxy required if tunnelled");
   }
   this.secure = secure;
   this.tunnelled = tunnelled != null ? tunnelled : TunnelType.PLAIN;
   this.layered = layered != null ? layered : LayerType.PLAIN;
 }