http client chunked implement via sun

private void sendRequestHeader()
        throws IOException
    {
        if(!isOwnerTrusted)
            reqProperties.addProperty("User-Agent", "UNTRUSTED/1.0");
        if(getRequestProperty("Content-Length") == null)
            setRequestField("Content-Length", Integer.toString(bytesToWrite));
        StringBuffer reqLine = new StringBuffer(256);
        String filename = url.path;
        if(filename == null)
            filename = "/";
        reqLine.append(method);
        reqLine.append(" ");
        reqLine.append(filename);
        if(url.query != null)
        {
            reqLine.append("?");
            reqLine.append(url.query);
        }
        reqLine.append(" ");
        reqLine.append(HTTP_VERSION);
        reqLine.append("\r\n");
        setRequestField("Host", url.authority);
        if(chunkedOut)
            setRequestField("Transfer-Encoding", "chunked");
        int numberOfKeys = reqProperties.size();
        for(int i = 0; i < numberOfKeys; i++)
        {
            String key = reqProperties.getKeyAt(i);
            if(key.equals("Content-Length"))
            {
                if(!chunkedOut)
                {
                    if(writebuf == null)
                    {
                        reqLine.append("Content-Length: 0");
                    } else
                    {
                        reqLine.append("Content-Length: ");
                        reqLine.append(bytesToWrite);
                    }
                    reqLine.append("\r\n");
                }
            } else
            {
                reqLine.append(key);
                reqLine.append(": ");
                reqLine.append(reqProperties.getValueAt(i));
                reqLine.append("\r\n");
            }
        }

        reqLine.append("\r\n");
        streamOutput.write(reqLine.toString().getBytes());

    }

  protected void finishRequestGetResponseHeader()
        throws IOException
    {
        requestFinished = true;
        if(chunkedOut)
            streamOutput.write("0\r\n\r\n".getBytes());
        streamOutput.flush();

        readResponseMessage(streamInput);
        readHeaders(streamInput);
        if(responseCode == 100)
        {
            readResponseMessage(streamInput);
            readHeaders(streamInput);
        }
    }


 protected void sendRequestBody()
        throws IOException
    {
        if(bytesToWrite == 0)
            return;
        if(!useChunks)
        {
            byte buff[] = writeStreamBuff.toByteArray();
            streamOutput.write(buff, 0, buff.length);
            bytesToWrite = 0;
            return;
        }
        if(writebuf == null)
            return;
        int start = 24;
        int endOfData = 24 + bytesToWrite;
        int length = bytesToWrite;
        if(chunkedOut)
        {
            String temp = Integer.toHexString(bytesToWrite);
            int tempLen = temp.length();
            writebuf[--start] = 10;
            writebuf[--start] = 13;
            for(int i = tempLen - 1; i >= 0; i--)
                writebuf[--start] = (byte)temp.charAt(i);

            length += tempLen + 2;
            writebuf[endOfData++] = 13;
            writebuf[endOfData++] = 10;
            length += 2;
        }
        streamOutput.write(writebuf, start, length);
        bytesToWrite = 0;
    }
//protocol .class

   private void sendRequest(boolean chunkData, boolean readResponseHeader)
        throws IOException
    {
        if(sendingRequest || requestFinished)
            return;
        sendingRequest = true;
        if(chunkData)
            chunkedOut = true;
        int bytesToRetry = bytesToWrite;
        try
        {
            startRequest();
            sendRequestBody();
            if(readResponseHeader)
                finishRequestGetResponseHeader();
        }
        catch(IOException ioe)
        {
            if(!(streamConnection instanceof StreamConnectionElement))
                throw ioe;
            try
            {
                connectionPool.remove((StreamConnectionElement)streamConnection);
            }
            catch(Exception e) { }
            if(firstChunkSent)
                throw new IOException("Persistent connection dropped after first chunk sent, cannot retry");
            streamConnection = null;
            streamInput = null;
            streamOutput = null;
            bytesToWrite = bytesToRetry;
            startRequest();
            sendRequestBody();
            if(readResponseHeader)
                finishRequestGetResponseHeader();
        }
        if(chunkedOut)
            firstChunkSent = true;
        sendingRequest = false;
        break MISSING_BLOCK_LABEL_169;
        Exception exception;
        exception;
        sendingRequest = false;
        throw exception;
    }

 

Never giveup. Thanks the world.
原文地址:https://www.cnblogs.com/cnsoft/p/97988.html