Uploaded image for project: 'HttpComponents HttpClient'
  1. HttpComponents HttpClient
  2. HTTPCLIENT-1170

Incomplete data received from servlet

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Blocker
    • Resolution: Invalid
    • 4.1.3
    • None
    • HttpClient (classic)
    • None
    • java 1.7.0_0, Windows 7 x 64, Apache 7.0.22, connections are made throug http://localhost

    Description

      Hi
      I have this servlet that generates on the fly a binary response by serializing an object. buf size is about 30 KB. I've been using this code to serve files for a long time. If I access that servlet using any web browser, the received file is OK.
      byte[] buf = respObject.stringBinSerialize();
      response.setContentLength(buf.length);
      response.setContentType("binary/octet-stream");
      response.setStatus(HttpServletResponse.SC_OK);
      OutputStream out = response.getOutputStream();
      out.write(buf);
      out.flush();

      Now I have this client code and it doesn't receive the full response.
      byte[] completo = new byte[0], temporal;
      byte[] cbuf = new byte[4096];
      int cuenta = 0, esta = 0;
      HttpParams params = new SyncBasicHttpParams();
      HttpConnectionParams.setSocketBufferSize(params, 64000);
      HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
      HttpClient httpclient = new DefaultHttpClient(params);
      try {
      HttpPost httpost = new HttpPost(targetURLinclServletName);
      HttpGet httpget = new HttpGet("http://localhost:8080/myservlet");
      HttpResponse response = httpclient.execute(httpget);
      HttpEntity entity = response.getEntity();
      if (entity != null) {
      System.out.println("ent sz " + entity.getContentLength() + " chk " + entity.isChunked() + " is rept " + entity.isRepeatable() + " str " + entity.isStreaming());
      // completo = EntityUtils.toByteArray(entity);
      System.out.println("bytearrayed " + completo.length);
      InputStream instream = entity.getContent();
      while (completo.length != entity.getContentLength() && (esta = instream.read(cbuf)) != -1) {
      if (selector.equals(RPCdefs.SELECTOR_PROYLIST) || true)

      { cuenta += esta; System.out.println("readline" + esta + " van " + cuenta); System.out.println("sz " + entity.getContentLength()); }

      temporal = new byte[completo.length + esta];
      System.arraycopy(completo, 0, temporal, 0, completo.length);
      System.arraycopy(cbuf, 0, temporal, completo.length, esta);
      completo = temporal;
      temporal = null;
      }
      }
      EntityUtils.consume(entity);
      } finally

      { httpclient.getConnectionManager().shutdown(); }

      The simplest way to receive is EntityUtils.toByteArray(entity), but it gets hung. The loop for partial copy is to know how may bytes are received. They are about 17845. The initial params were added to check if the issue was related to flow control, but with 64 KB buffers it doesn't changes anything.

      Attachments

        Activity

          People

            Unassigned Unassigned
            aperezymadrid Aniceto PĂ©rez y Madrid
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: