• 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.
  • 相关阅读:
    通过kettle数据导入mysql时,空值的处理在插入mysql时,会自动转转换为null值,无法插入
    centos 安装配置kettle
    centos服务器安装配置Postgre9.6
    python 获取随机字母
    defaultdict & Counter
    PIL 安装及使用
    python之yield和Generator
    Win7系统中用anaconda配置tensorflow运行环境
    #基础概念#之tensor
    python 生成特定间隔数列的方法
  • 原文地址:https://www.cnblogs.com/cnsoft/p/97988.html
Copyright © 2020-2023  润新知