Search in sources :

Example 6 with MessageConstraintException

use of org.apache.hc.core5.http.MessageConstraintException in project httpcomponents-core by apache.

the class ChunkDecoder method read.

@Override
public int read(final ByteBuffer dst) throws IOException {
    Args.notNull(dst, "Byte buffer");
    if (this.state == State.COMPLETED) {
        return -1;
    }
    int totalRead = 0;
    while (this.state != State.COMPLETED) {
        if (!this.buffer.hasData() || this.chunkSize == -1L) {
            final int bytesRead = fillBufferFromChannel();
            if (bytesRead == -1) {
                this.endOfStream = true;
            }
        }
        switch(this.state) {
            case READ_CONTENT:
                if (this.chunkSize == -1L) {
                    readChunkHead();
                    if (this.chunkSize == -1L) {
                        // Unable to read a chunk head
                        return totalRead;
                    }
                    if (this.chunkSize == 0L) {
                        // Last chunk. Read footers
                        this.chunkSize = -1L;
                        this.state = State.READ_FOOTERS;
                        break;
                    }
                }
                final long maxLen = this.chunkSize - this.pos;
                final int len = this.buffer.read(dst, (int) Math.min(maxLen, Integer.MAX_VALUE));
                if (len > 0) {
                    this.pos += len;
                    totalRead += len;
                } else {
                    if (!this.buffer.hasData() && this.endOfStream) {
                        this.state = State.COMPLETED;
                        setCompleted();
                        throw new TruncatedChunkException("Truncated chunk (expected size: %d; actual size: %d)", chunkSize, pos);
                    }
                }
                if (this.pos == this.chunkSize) {
                    // At the end of the chunk
                    this.chunkSize = -1L;
                    this.pos = 0L;
                    this.endOfChunk = true;
                    break;
                }
                return totalRead;
            case READ_FOOTERS:
                if (this.lineBuf == null) {
                    this.lineBuf = new CharArrayBuffer(32);
                } else {
                    this.lineBuf.clear();
                }
                if (!this.buffer.readLine(this.lineBuf, this.endOfStream)) {
                    // Unable to read a footer
                    if (this.endOfStream) {
                        this.state = State.COMPLETED;
                        setCompleted();
                    }
                    return totalRead;
                }
                if (this.lineBuf.length() > 0) {
                    final int maxHeaderCount = this.http1Config.getMaxHeaderCount();
                    if (maxHeaderCount > 0 && trailerBufs.size() >= maxHeaderCount) {
                        throw new MessageConstraintException("Maximum header count exceeded");
                    }
                    parseHeader();
                } else {
                    this.state = State.COMPLETED;
                    setCompleted();
                    processFooters();
                }
                break;
        }
    }
    return totalRead;
}
Also used : CharArrayBuffer(org.apache.hc.core5.util.CharArrayBuffer) TruncatedChunkException(org.apache.hc.core5.http.TruncatedChunkException) MessageConstraintException(org.apache.hc.core5.http.MessageConstraintException)

Example 7 with MessageConstraintException

use of org.apache.hc.core5.http.MessageConstraintException in project httpcomponents-core by apache.

the class ChunkDecoder method parseHeader.

private void parseHeader() throws IOException {
    final CharArrayBuffer current = this.lineBuf;
    final int count = this.trailerBufs.size();
    if ((this.lineBuf.charAt(0) == ' ' || this.lineBuf.charAt(0) == '\t') && count > 0) {
        // Handle folded header line
        final CharArrayBuffer previous = this.trailerBufs.get(count - 1);
        int i = 0;
        while (i < current.length()) {
            final char ch = current.charAt(i);
            if (ch != ' ' && ch != '\t') {
                break;
            }
            i++;
        }
        final int maxLineLen = this.http1Config.getMaxLineLength();
        if (maxLineLen > 0 && previous.length() + 1 + current.length() - i > maxLineLen) {
            throw new MessageConstraintException("Maximum line length limit exceeded");
        }
        previous.append(' ');
        previous.append(current, i, current.length() - i);
    } else {
        this.trailerBufs.add(current);
        this.lineBuf = null;
    }
}
Also used : CharArrayBuffer(org.apache.hc.core5.util.CharArrayBuffer) MessageConstraintException(org.apache.hc.core5.http.MessageConstraintException)

Aggregations

MessageConstraintException (org.apache.hc.core5.http.MessageConstraintException)7 CharArrayBuffer (org.apache.hc.core5.util.CharArrayBuffer)6 CoderResult (java.nio.charset.CoderResult)1 ConnectionClosedException (org.apache.hc.core5.http.ConnectionClosedException)1 Header (org.apache.hc.core5.http.Header)1 MalformedChunkCodingException (org.apache.hc.core5.http.MalformedChunkCodingException)1 TruncatedChunkException (org.apache.hc.core5.http.TruncatedChunkException)1