Example usage for io.netty.handler.codec.http HttpHeaderValues CHUNKED

List of usage examples for io.netty.handler.codec.http HttpHeaderValues CHUNKED

Introduction

In this page you can find the example usage for io.netty.handler.codec.http HttpHeaderValues CHUNKED.

Prototype

AsciiString CHUNKED

To view the source code for io.netty.handler.codec.http HttpHeaderValues CHUNKED.

Click Source Link

Document

"chunked"

Usage

From source file:com.bunjlabs.fuga.network.netty.NettyHttpServerHandler.java

License:Apache License

private void writeResponse(ChannelHandlerContext ctx, Request request, Response response) {
    HttpResponse httpresponse = new DefaultHttpResponse(HttpVersion.HTTP_1_1,
            HttpResponseStatus.valueOf(response.status()));

    httpresponse.headers().set(HttpHeaderNames.TRANSFER_ENCODING, HttpHeaderValues.CHUNKED);
    httpresponse.headers().set(HttpHeaderNames.CONTENT_TYPE, response.contentType());

    // Disable cache by default
    httpresponse.headers().set(HttpHeaderNames.CACHE_CONTROL, "no-cache, no-store, must-revalidate, max-age=0");
    httpresponse.headers().set(HttpHeaderNames.PRAGMA, "no-cache");
    httpresponse.headers().set(HttpHeaderNames.EXPIRES, "0");

    response.headers().entrySet().stream().forEach((e) -> httpresponse.headers().set(e.getKey(), e.getValue()));

    httpresponse.headers().set(HttpHeaderNames.SERVER, "Fuga Netty Web Server/" + serverVersion);

    // Set cookies
    httpresponse.headers().set(HttpHeaderNames.SET_COOKIE,
            ServerCookieEncoder.STRICT.encode(NettyCookieConverter.convertListToNetty(response.cookies())));

    if (response.length() >= 0) {
        httpresponse.headers().set(HttpHeaderNames.CONTENT_LENGTH, response.length());
    }/*from  w w  w . j  a va2s  .  c  o  m*/

    if (HttpUtil.isKeepAlive(httprequest)) {
        httpresponse.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE);
    } else {
        httpresponse.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE);
    }

    ctx.write(httpresponse);

    if (response.stream() != null) {
        ctx.write(new HttpChunkedInput(new ChunkedStream(response.stream())));
    }

    LastHttpContent fs = new DefaultLastHttpContent();
    ChannelFuture sendContentFuture = ctx.writeAndFlush(fs);
    if (!HttpUtil.isKeepAlive(httprequest)) {
        sendContentFuture.addListener(ChannelFutureListener.CLOSE);
    }
}

From source file:com.jiabo.letty.servlet.container.HttpParser.java

License:Open Source License

/**
 * Parse until next Event.// w  w w  . j  av  a2  s.c  o  m
 * 
 * @return an indication of progress <0 EOF, 0 no progress, >0 progress.
 */
public int parseNext() throws IOException {
    try {
        int progress = 0;

        if (_state == STATE_END)
            return 0;

        if (_buffer == null)
            _buffer = getHeaderBuffer();

        if (_state == STATE_CONTENT && _contentPosition == _contentLength) {
            _state = STATE_END;
            _handler.messageComplete(_contentPosition);
            return 1;
        }

        int length = _buffer.length();

        // Fill buffer if we can
        if (length == 0) {
            int filled = -1;
            IOException ex = null;
            try {
                filled = fill();
                LOG.debug("filled {}/{}", filled, _buffer.length());
            } catch (IOException e) {
                LOG.debug(this.toString(), e);
                ex = e;
            }

            if (filled > 0)
                progress++;
            else if (filled < 0) {
                _persistent = false;

                // do we have content to deliver?
                if (_state > STATE_END) {
                    if (_buffer.length() > 0 && !_headResponse) {
                        Buffer chunk = _buffer.get(_buffer.length());
                        _contentPosition += chunk.length();
                        _contentView.update(chunk);
                        _handler.content(chunk); // May recurse here
                    }
                }

                // was this unexpected?
                switch (_state) {
                case STATE_END:
                case STATE_SEEKING_EOF:
                    _state = STATE_END;
                    break;

                case STATE_EOF_CONTENT:
                    _state = STATE_END;
                    _handler.messageComplete(_contentPosition);
                    break;

                default:
                    _state = STATE_END;
                    if (!_headResponse)
                        _handler.earlyEOF();
                    _handler.messageComplete(_contentPosition);
                }

                if (ex != null)
                    throw ex;

                if (!isComplete() && !isIdle())
                    throw new EofException();

                return -1;
            }
            length = _buffer.length();
        }

        // Handle header states
        byte ch;
        byte[] array = _buffer.array();
        int last = _state;
        while (_state < STATE_END && length-- > 0) {
            if (last != _state) {
                progress++;
                last = _state;
            }

            ch = _buffer.get();

            if (_eol == HttpTokens.CARRIAGE_RETURN) {
                if (ch == HttpTokens.LINE_FEED) {
                    _eol = HttpTokens.LINE_FEED;
                    continue;
                }
                throw new HttpException(HttpStatus.BAD_REQUEST_400);
            }
            _eol = 0;

            switch (_state) {
            case STATE_START:
                _contentLength = HttpTokens.UNKNOWN_CONTENT;
                _cached = null;
                if (ch > HttpTokens.SPACE || ch < 0) {
                    _buffer.mark();
                    _state = STATE_FIELD0;
                }
                break;

            case STATE_FIELD0:
                if (ch == HttpTokens.SPACE) {
                    _tok0.update(_buffer.markIndex(), _buffer.getIndex() - 1);
                    _responseStatus = HttpVersions.CACHE.get(_tok0) == null ? -1 : 0;
                    _state = STATE_SPACE1;
                    continue;
                } else if (ch < HttpTokens.SPACE && ch >= 0) {
                    throw new HttpException(HttpStatus.BAD_REQUEST_400);
                }
                break;

            case STATE_SPACE1:
                if (ch > HttpTokens.SPACE || ch < 0) {
                    _buffer.mark();
                    if (_responseStatus >= 0) {
                        _state = STATE_STATUS;
                        _responseStatus = ch - '0';
                    } else
                        _state = STATE_URI;
                } else if (ch < HttpTokens.SPACE) {
                    throw new HttpException(HttpStatus.BAD_REQUEST_400);
                }
                break;

            case STATE_STATUS:
                if (ch == HttpTokens.SPACE) {
                    _tok1.update(_buffer.markIndex(), _buffer.getIndex() - 1);
                    _state = STATE_SPACE2;
                    continue;
                } else if (ch >= '0' && ch <= '9') {
                    _responseStatus = _responseStatus * 10 + (ch - '0');
                    continue;
                } else if (ch < HttpTokens.SPACE && ch >= 0) {
                    _handler.startResponse(HttpMethods.CACHE.lookup(_tok0), _responseStatus, null);
                    _eol = ch;
                    _state = STATE_HEADER;
                    _tok0.setPutIndex(_tok0.getIndex());
                    _tok1.setPutIndex(_tok1.getIndex());
                    _multiLineValue = null;
                    continue;
                }
                // not a digit, so must be a URI
                _state = STATE_URI;
                _responseStatus = -1;
                break;

            case STATE_URI:
                if (ch == HttpTokens.SPACE) {
                    _tok1.update(_buffer.markIndex(), _buffer.getIndex() - 1);
                    _state = STATE_SPACE2;
                    continue;
                } else if (ch < HttpTokens.SPACE && ch >= 0) {
                    // HTTP/0.9
                    _handler.startRequest(HttpMethods.CACHE.lookup(_tok0), _buffer.sliceFromMark(), null);
                    _persistent = false;
                    _state = STATE_SEEKING_EOF;
                    _handler.headerComplete();
                    _handler.messageComplete(_contentPosition);
                    return 1;
                }
                break;

            case STATE_SPACE2:
                if (ch > HttpTokens.SPACE || ch < 0) {
                    _buffer.mark();
                    _state = STATE_FIELD2;
                } else if (ch < HttpTokens.SPACE) {
                    if (_responseStatus > 0) {
                        _handler.startResponse(HttpMethods.CACHE.lookup(_tok0), _responseStatus, null);
                        _eol = ch;
                        _state = STATE_HEADER;
                        _tok0.setPutIndex(_tok0.getIndex());
                        _tok1.setPutIndex(_tok1.getIndex());
                        _multiLineValue = null;
                    } else {
                        // HTTP/0.9
                        _handler.startRequest(HttpMethods.CACHE.lookup(_tok0), _tok1, null);
                        _persistent = false;
                        _state = STATE_SEEKING_EOF;
                        _handler.headerComplete();
                        _handler.messageComplete(_contentPosition);
                        return 1;
                    }
                }
                break;

            case STATE_FIELD2:
                if (ch == HttpTokens.CARRIAGE_RETURN || ch == HttpTokens.LINE_FEED) {
                    Buffer version;
                    if (_responseStatus > 0)
                        _handler.startResponse(version = HttpVersions.CACHE.lookup(_tok0), _responseStatus,
                                _buffer.sliceFromMark());
                    else
                        _handler.startRequest(HttpMethods.CACHE.lookup(_tok0), _tok1,
                                version = HttpVersions.CACHE.lookup(_buffer.sliceFromMark()));
                    _eol = ch;
                    _persistent = HttpVersions.CACHE.getOrdinal(version) >= HttpVersions.HTTP_1_1_ORDINAL;
                    _state = STATE_HEADER;
                    _tok0.setPutIndex(_tok0.getIndex());
                    _tok1.setPutIndex(_tok1.getIndex());
                    _multiLineValue = null;
                    continue;
                }
                break;

            case STATE_HEADER:
                switch (ch) {
                case HttpTokens.COLON:
                case HttpTokens.SPACE:
                case HttpTokens.TAB: {
                    // header value without name - continuation?
                    _length = -1;
                    _state = STATE_HEADER_VALUE;
                    break;
                }

                default: {
                    // handler last header if any
                    if (_cached != null || _tok0.length() > 0 || _tok1.length() > 0
                            || _multiLineValue != null) {
                        Buffer header = _cached != null ? _cached : HttpHeaders.CACHE.lookup(_tok0);
                        _cached = null;
                        Buffer value = _multiLineValue == null ? _tok1 : new ByteArrayBuffer(_multiLineValue);

                        int ho = HttpHeaders.CACHE.getOrdinal(header);
                        if (ho >= 0) {
                            int vo;

                            switch (ho) {
                            case HttpHeaders.CONTENT_LENGTH_ORDINAL:
                                if (_contentLength != HttpTokens.CHUNKED_CONTENT) {
                                    try {
                                        _contentLength = BufferUtil.toLong(value);
                                    } catch (NumberFormatException e) {
                                        LOG.ignore(e);
                                        throw new HttpException(HttpStatus.BAD_REQUEST_400);
                                    }
                                    if (_contentLength <= 0)
                                        _contentLength = HttpTokens.NO_CONTENT;
                                }
                                break;

                            case HttpHeaders.TRANSFER_ENCODING_ORDINAL:
                                value = HttpHeaderValues.CACHE.lookup(value);
                                vo = HttpHeaderValues.CACHE.getOrdinal(value);
                                if (HttpHeaderValues.CHUNKED_ORDINAL == vo)
                                    _contentLength = HttpTokens.CHUNKED_CONTENT;
                                else {
                                    String c = value.toString(StringUtil.__ISO_8859_1);
                                    if (c.endsWith(HttpHeaderValues.CHUNKED))
                                        _contentLength = HttpTokens.CHUNKED_CONTENT;

                                    else if (c.indexOf(HttpHeaderValues.CHUNKED) >= 0)
                                        throw new HttpException(400, null);
                                }
                                break;

                            case HttpHeaders.CONNECTION_ORDINAL:
                                switch (HttpHeaderValues.CACHE.getOrdinal(value)) {
                                case HttpHeaderValues.CLOSE_ORDINAL:
                                    _persistent = false;
                                    break;

                                case HttpHeaderValues.KEEP_ALIVE_ORDINAL:
                                    _persistent = true;
                                    break;

                                case -1: // No match, may be multi valued
                                {
                                    for (String v : value.toString().split(",")) {
                                        switch (HttpHeaderValues.CACHE.getOrdinal(v.trim())) {
                                        case HttpHeaderValues.CLOSE_ORDINAL:
                                            _persistent = false;
                                            break;

                                        case HttpHeaderValues.KEEP_ALIVE_ORDINAL:
                                            _persistent = true;
                                            break;
                                        }
                                    }
                                    break;
                                }
                                }
                            }
                        }

                        _handler.parsedHeader(header, value);
                        _tok0.setPutIndex(_tok0.getIndex());
                        _tok1.setPutIndex(_tok1.getIndex());
                        _multiLineValue = null;
                    }
                    _buffer.setMarkIndex(-1);

                    // now handle ch
                    if (ch == HttpTokens.CARRIAGE_RETURN || ch == HttpTokens.LINE_FEED) {
                        // is it a response that cannot have a body?
                        if (_responseStatus > 0 && // response
                                (_responseStatus == 304 || // not-modified
                                // response
                                        _responseStatus == 204 || // no-content
                                        // response
                                        _responseStatus < 200)) // 1xx response
                            _contentLength = HttpTokens.NO_CONTENT; // ignore
                        // any
                        // other
                        // headers
                        // set
                        // else if we don't know framing
                        else if (_contentLength == HttpTokens.UNKNOWN_CONTENT) {
                            if (_responseStatus == 0 // request
                                    || _responseStatus == 304 // not-modified
                                    // response
                                    || _responseStatus == 204 // no-content
                                    // response
                                    || _responseStatus < 200) // 1xx
                                // response
                                _contentLength = HttpTokens.NO_CONTENT;
                            else
                                _contentLength = HttpTokens.EOF_CONTENT;
                        }

                        _contentPosition = 0;
                        _eol = ch;
                        if (_eol == HttpTokens.CARRIAGE_RETURN && _buffer.hasContent()
                                && _buffer.peek() == HttpTokens.LINE_FEED)
                            _eol = _buffer.get();

                        // We convert _contentLength to an int for this
                        // switch statement because
                        // we don't care about the amount of data available
                        // just whether there is some.
                        switch (_contentLength > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) _contentLength) {
                        case HttpTokens.EOF_CONTENT:
                            _state = STATE_EOF_CONTENT;
                            _handler.headerComplete(); // May recurse here !
                            break;

                        case HttpTokens.CHUNKED_CONTENT:
                            _state = STATE_CHUNKED_CONTENT;
                            _handler.headerComplete(); // May recurse here !
                            break;

                        case HttpTokens.NO_CONTENT:
                            _handler.headerComplete();
                            _state = _persistent || (_responseStatus >= 100 && _responseStatus < 200)
                                    ? STATE_END
                                    : STATE_SEEKING_EOF;
                            _handler.messageComplete(_contentPosition);
                            return 1;

                        default:
                            _state = STATE_CONTENT;
                            _handler.headerComplete(); // May recurse here !
                            break;
                        }
                        return 1;
                    } else {
                        // New header
                        _length = 1;
                        _buffer.mark();
                        _state = STATE_HEADER_NAME;

                        // try cached name!
                        if (array != null) {
                            _cached = HttpHeaders.CACHE.getBest(array, _buffer.markIndex(), length + 1);

                            if (_cached != null) {
                                _length = _cached.length();
                                _buffer.setGetIndex(_buffer.markIndex() + _length);
                                length = _buffer.length();
                            }
                        }
                    }
                }
                }

                break;

            case STATE_HEADER_NAME:
                switch (ch) {
                case HttpTokens.CARRIAGE_RETURN:
                case HttpTokens.LINE_FEED:
                    if (_length > 0)
                        _tok0.update(_buffer.markIndex(), _buffer.markIndex() + _length);
                    _eol = ch;
                    _state = STATE_HEADER;
                    break;
                case HttpTokens.COLON:
                    if (_length > 0 && _cached == null)
                        _tok0.update(_buffer.markIndex(), _buffer.markIndex() + _length);
                    _length = -1;
                    _state = STATE_HEADER_VALUE;
                    break;
                case HttpTokens.SPACE:
                case HttpTokens.TAB:
                    break;
                default: {
                    _cached = null;
                    if (_length == -1)
                        _buffer.mark();
                    _length = _buffer.getIndex() - _buffer.markIndex();
                    _state = STATE_HEADER_IN_NAME;
                }
                }

                break;

            case STATE_HEADER_IN_NAME:
                switch (ch) {
                case HttpTokens.CARRIAGE_RETURN:
                case HttpTokens.LINE_FEED:
                    if (_length > 0)
                        _tok0.update(_buffer.markIndex(), _buffer.markIndex() + _length);
                    _eol = ch;
                    _state = STATE_HEADER;
                    break;
                case HttpTokens.COLON:
                    if (_length > 0 && _cached == null)
                        _tok0.update(_buffer.markIndex(), _buffer.markIndex() + _length);
                    _length = -1;
                    _state = STATE_HEADER_VALUE;
                    break;
                case HttpTokens.SPACE:
                case HttpTokens.TAB:
                    _state = STATE_HEADER_NAME;
                    break;
                default: {
                    _cached = null;
                    _length++;
                }
                }
                break;

            case STATE_HEADER_VALUE:
                switch (ch) {
                case HttpTokens.CARRIAGE_RETURN:
                case HttpTokens.LINE_FEED:
                    if (_length > 0) {
                        if (_tok1.length() == 0)
                            _tok1.update(_buffer.markIndex(), _buffer.markIndex() + _length);
                        else {
                            // Continuation line!
                            if (_multiLineValue == null)
                                _multiLineValue = _tok1.toString(StringUtil.__ISO_8859_1);
                            _tok1.update(_buffer.markIndex(), _buffer.markIndex() + _length);
                            _multiLineValue += " " + _tok1.toString(StringUtil.__ISO_8859_1);
                        }
                    }
                    _eol = ch;
                    _state = STATE_HEADER;
                    break;
                case HttpTokens.SPACE:
                case HttpTokens.TAB:
                    break;
                default: {
                    if (_length == -1)
                        _buffer.mark();
                    _length = _buffer.getIndex() - _buffer.markIndex();
                    _state = STATE_HEADER_IN_VALUE;
                }
                }
                break;

            case STATE_HEADER_IN_VALUE:
                switch (ch) {
                case HttpTokens.CARRIAGE_RETURN:
                case HttpTokens.LINE_FEED:
                    if (_length > 0) {
                        if (_tok1.length() == 0)
                            _tok1.update(_buffer.markIndex(), _buffer.markIndex() + _length);
                        else {
                            // Continuation line!
                            if (_multiLineValue == null)
                                _multiLineValue = _tok1.toString(StringUtil.__ISO_8859_1);
                            _tok1.update(_buffer.markIndex(), _buffer.markIndex() + _length);
                            _multiLineValue += " " + _tok1.toString(StringUtil.__ISO_8859_1);
                        }
                    }
                    _eol = ch;
                    _state = STATE_HEADER;
                    break;
                case HttpTokens.SPACE:
                case HttpTokens.TAB:
                    _state = STATE_HEADER_VALUE;
                    break;
                default:
                    _length++;
                }
                break;
            }
        } // end of HEADER states loop

        // ==========================

        // Handle HEAD response
        if (_responseStatus > 0 && _headResponse) {
            _state = _persistent || (_responseStatus >= 100 && _responseStatus < 200) ? STATE_END
                    : STATE_SEEKING_EOF;
            _handler.messageComplete(_contentLength);
        }

        // ==========================

        // Handle _content
        length = _buffer.length();
        Buffer chunk;
        last = _state;
        while (_state > STATE_END && length > 0) {
            if (last != _state) {
                progress++;
                last = _state;
            }

            if (_eol == HttpTokens.CARRIAGE_RETURN && _buffer.peek() == HttpTokens.LINE_FEED) {
                _eol = _buffer.get();
                length = _buffer.length();
                continue;
            }
            _eol = 0;
            switch (_state) {
            case STATE_EOF_CONTENT:
                chunk = _buffer.get(_buffer.length());
                _contentPosition += chunk.length();
                _contentView.update(chunk);
                _handler.content(chunk); // May recurse here
                // TODO adjust the _buffer to keep unconsumed content
                return 1;

            case STATE_CONTENT: {
                long remaining = _contentLength - _contentPosition;
                if (remaining == 0) {
                    _state = _persistent ? STATE_END : STATE_SEEKING_EOF;
                    _handler.messageComplete(_contentPosition);
                    return 1;
                }

                if (length > remaining) {
                    // We can cast reamining to an int as we know that it is
                    // smaller than
                    // or equal to length which is already an int.
                    length = (int) remaining;
                }

                chunk = _buffer.get(length);
                _contentPosition += chunk.length();
                _contentView.update(chunk);
                _handler.content(chunk); // May recurse here

                if (_contentPosition == _contentLength) {
                    _state = _persistent ? STATE_END : STATE_SEEKING_EOF;
                    _handler.messageComplete(_contentPosition);
                }
                // TODO adjust the _buffer to keep unconsumed content
                return 1;
            }

            case STATE_CHUNKED_CONTENT: {
                ch = _buffer.peek();
                if (ch == HttpTokens.CARRIAGE_RETURN || ch == HttpTokens.LINE_FEED)
                    _eol = _buffer.get();
                else if (ch <= HttpTokens.SPACE)
                    _buffer.get();
                else {
                    _chunkLength = 0;
                    _chunkPosition = 0;
                    _state = STATE_CHUNK_SIZE;
                }
                break;
            }

            case STATE_CHUNK_SIZE: {
                ch = _buffer.get();
                if (ch == HttpTokens.CARRIAGE_RETURN || ch == HttpTokens.LINE_FEED) {
                    _eol = ch;

                    if (_chunkLength == 0) {
                        if (_eol == HttpTokens.CARRIAGE_RETURN && _buffer.hasContent()
                                && _buffer.peek() == HttpTokens.LINE_FEED)
                            _eol = _buffer.get();
                        _state = _persistent ? STATE_END : STATE_SEEKING_EOF;
                        _handler.messageComplete(_contentPosition);
                        return 1;
                    } else
                        _state = STATE_CHUNK;
                } else if (ch <= HttpTokens.SPACE || ch == HttpTokens.SEMI_COLON)
                    _state = STATE_CHUNK_PARAMS;
                else if (ch >= '0' && ch <= '9')
                    _chunkLength = _chunkLength * 16 + (ch - '0');
                else if (ch >= 'a' && ch <= 'f')
                    _chunkLength = _chunkLength * 16 + (10 + ch - 'a');
                else if (ch >= 'A' && ch <= 'F')
                    _chunkLength = _chunkLength * 16 + (10 + ch - 'A');
                else
                    throw new IOException("bad chunk char: " + ch);
                break;
            }

            case STATE_CHUNK_PARAMS: {
                ch = _buffer.get();
                if (ch == HttpTokens.CARRIAGE_RETURN || ch == HttpTokens.LINE_FEED) {
                    _eol = ch;
                    if (_chunkLength == 0) {
                        if (_eol == HttpTokens.CARRIAGE_RETURN && _buffer.hasContent()
                                && _buffer.peek() == HttpTokens.LINE_FEED)
                            _eol = _buffer.get();
                        _state = _persistent ? STATE_END : STATE_SEEKING_EOF;
                        _handler.messageComplete(_contentPosition);
                        return 1;
                    } else
                        _state = STATE_CHUNK;
                }
                break;
            }

            case STATE_CHUNK: {
                int remaining = _chunkLength - _chunkPosition;
                if (remaining == 0) {
                    _state = STATE_CHUNKED_CONTENT;
                    break;
                } else if (length > remaining)
                    length = remaining;
                chunk = _buffer.get(length);
                _contentPosition += chunk.length();
                _chunkPosition += chunk.length();
                _contentView.update(chunk);
                _handler.content(chunk); // May recurse here
                // TODO adjust the _buffer to keep unconsumed content
                return 1;
            }

            case STATE_SEEKING_EOF: {
                // Close if there is more data than CRLF
                if (_buffer.length() > 2) {
                    _state = STATE_END;
                    _endp.close();
                } else {
                    // or if the data is not white space
                    while (_buffer.length() > 0)
                        if (!Character.isWhitespace(_buffer.get())) {
                            _state = STATE_END;
                            _endp.close();
                            _buffer.clear();
                        }
                }

                _buffer.clear();
                break;
            }
            }

            length = _buffer.length();
        }

        return progress;
    } catch (HttpException e) {
        _persistent = false;
        _state = STATE_SEEKING_EOF;
        throw e;
    }
}

From source file:com.linecorp.armeria.internal.http.Http1ObjectEncoder.java

License:Apache License

private HttpObject convertClientHeaders(int streamId, HttpHeaders headers) throws Http2Exception {

    // Leading headers will always have :method, trailers will never have it.
    final HttpMethod method = headers.method();
    if (method == null) {
        return convertTrailingHeaders(streamId, headers);
    }// ww  w.j  a  v  a 2 s  .  c  om

    // Convert leading headers.
    final HttpRequest req = new DefaultHttpRequest(HttpVersion.HTTP_1_1, method.toNettyMethod(), headers.path(),
            false);

    convert(streamId, headers, req.headers(), false);
    if (HttpUtil.getContentLength(req, -1L) >= 0) {
        // Avoid the case where both 'content-length' and 'transfer-encoding' are set.
        req.headers().remove(HttpHeaderNames.TRANSFER_ENCODING);
    } else {
        req.headers().set(HttpHeaderNames.TRANSFER_ENCODING, HttpHeaderValues.CHUNKED);
    }

    return req;
}

From source file:com.linecorp.armeria.internal.http.Http1ObjectEncoder.java

License:Apache License

private static void setTransferEncoding(HttpMessage out) {
    final io.netty.handler.codec.http.HttpHeaders outHeaders = out.headers();
    final long contentLength = HttpUtil.getContentLength(out, -1L);
    if (contentLength < 0) {
        // Use chunked encoding.
        outHeaders.set(HttpHeaderNames.TRANSFER_ENCODING, HttpHeaderValues.CHUNKED);
        outHeaders.remove(HttpHeaderNames.CONTENT_LENGTH);
    }/*  w w  w. j av a  2 s.  c om*/
}

From source file:com.linecorp.armeria.internal.Http1ObjectEncoder.java

License:Apache License

private HttpObject convertClientHeaders(int streamId, HttpHeaders headers, boolean endStream)
        throws Http2Exception {

    // Leading headers will always have :method, trailers will never have it.
    final HttpMethod method = headers.method();
    if (method == null) {
        return convertTrailingHeaders(streamId, headers);
    }/*from ww w  .  ja  v a  2 s .co  m*/

    // Convert leading headers.
    final String path = headers.path();
    assert path != null;
    final HttpRequest req = new DefaultHttpRequest(HttpVersion.HTTP_1_1,
            io.netty.handler.codec.http.HttpMethod.valueOf(method.name()), path, false);

    convert(streamId, headers, req.headers(), false);

    if (endStream) {
        req.headers().remove(HttpHeaderNames.TRANSFER_ENCODING);
        req.headers().remove(HttpHeaderNames.CONTENT_LENGTH);
    } else if (HttpUtil.getContentLength(req, -1L) >= 0) {
        // Avoid the case where both 'content-length' and 'transfer-encoding' are set.
        req.headers().remove(HttpHeaderNames.TRANSFER_ENCODING);
    } else {
        req.headers().set(HttpHeaderNames.TRANSFER_ENCODING, HttpHeaderValues.CHUNKED);
    }

    return req;
}

From source file:com.linkedin.r2.transport.http.client.NettyRequestAdapter.java

License:Apache License

/**
 * Adapts a StreamRequest to Netty's HttpRequest
 * @param request  R2 stream request/*from w  w w.j a va  2s. co m*/
 * @return Adapted HttpRequest.
 */
static HttpRequest toNettyRequest(StreamRequest request) throws Exception {
    HttpMethod nettyMethod = HttpMethod.valueOf(request.getMethod());
    URL url = new URL(request.getURI().toString());
    String path = url.getFile();
    // RFC 2616, section 5.1.2:
    //   Note that the absolute path cannot be empty; if none is present in the original URI,
    //   it MUST be given as "/" (the server root).
    if (path.isEmpty()) {
        path = "/";
    }

    HttpRequest nettyRequest = new DefaultHttpRequest(HttpVersion.HTTP_1_1, nettyMethod, path);
    nettyRequest.headers().set(HttpHeaderNames.TRANSFER_ENCODING, HttpHeaderValues.CHUNKED);

    for (Map.Entry<String, String> entry : request.getHeaders().entrySet()) {
        // RFC 7230, section 3.3.2
        //   A sender MUST NOT send a Content-Length header field in any message
        //   that contains a Transfer-Encoding header field.
        if (entry.getKey().equalsIgnoreCase(HttpHeaderNames.CONTENT_LENGTH.toString())) {
            continue;
        }

        nettyRequest.headers().set(entry.getKey(), entry.getValue());
    }
    nettyRequest.headers().set(HttpHeaderNames.HOST, url.getAuthority());
    nettyRequest.headers().set(HttpConstants.REQUEST_COOKIE_HEADER_NAME, request.getCookies());

    return nettyRequest;
}

From source file:com.ociweb.pronghorn.adapter.netty.impl.HttpStaticFileServerHandler.java

License:Apache License

public static void beginHTTPResponse(ChannelHandlerContext ctx, FullHttpRequest request, long lastModified,
        String path, long fileLength) {
    HttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK);
    HttpUtil.setContentLength(response, fileLength);
    setContentTypeHeader(response, path);

    response.headers().set(HttpHeaderNames.TRANSFER_ENCODING, HttpHeaderValues.CHUNKED);

    setDateAndCacheHeaders(response, lastModified);
    if (HttpUtil.isKeepAlive(request)) {
        response.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE);
    }//from   w  w  w .  java  2  s. co m

    // Write the initial line and the header.
    ctx.write(response);
}

From source file:io.gatling.http.client.BasicHttpTest.java

License:Apache License

@Test
void testJettyRespondsWithChunkedTransferEncoding() throws Throwable {
    withClient().run(client -> withServer(server).run(server -> {
        server.enqueueEcho();//from   w  ww. j  a v a  2 s.c om
        Request request = new RequestBuilder(HttpMethod.GET, Uri.create(getTargetUrl())).build();
        client.test(request, 0, new TestListener() {
            @Override
            public void onComplete0() {
                assertEquals(200, status.code());
                assertEquals(HttpHeaderValues.CHUNKED.toString(), headers.get(TRANSFER_ENCODING));
            }
        }).get(TIMEOUT_SECONDS, SECONDS);
    }));
}

From source file:io.gatling.http.client.impl.request.WritableRequestBuilder.java

License:Apache License

private static WritableRequest buildRequestWithBody(String url, Uri uri, HttpMethod method, HttpHeaders headers,
        RequestBody<?> requestBody, ByteBufAllocator alloc, HttpClientConfig config) throws IOException {

    boolean zeroCopy = !uri.isSecured() && config.isEnableZeroCopy();
    WritableContent writableContent = requestBody.build(zeroCopy, alloc);

    Object content = writableContent.getContent();

    if (content instanceof ByteBuf) {
        ByteBuf bb = (ByteBuf) content;//from  w w w. j  ava 2 s . c  o m
        if (!headers.contains(CONTENT_LENGTH)) {
            headers.set(CONTENT_LENGTH, bb.readableBytes());
        }
        FullHttpRequest nettyRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, method, url, bb,
                headers, EmptyHttpHeaders.INSTANCE);

        return new WritableRequest(nettyRequest, null);

    } else {
        if (!headers.contains(CONTENT_LENGTH) && !headers.contains(TRANSFER_ENCODING)) {
            if (writableContent.getContentLength() >= 0) {
                headers.set(CONTENT_LENGTH, writableContent.getContentLength());
            } else {
                headers.set(TRANSFER_ENCODING, HttpHeaderValues.CHUNKED);
            }
        }

        HttpRequest nettyRequest = new DefaultHttpRequest(HttpVersion.HTTP_1_1, method, url, headers);

        return new WritableRequest(nettyRequest, content);
    }
}

From source file:org.apache.hyracks.http.server.ChunkedResponse.java

License:Apache License

public ChunkedResponse(ChannelHandlerContext ctx, FullHttpRequest request, int chunkSize) {
    this.ctx = ctx;
    outputStream = new ChunkedNettyOutputStream(ctx, chunkSize, this);
    writer = new PrintWriter(outputStream);
    response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.INTERNAL_SERVER_ERROR);
    response.headers().set(HttpHeaderNames.TRANSFER_ENCODING, HttpHeaderValues.CHUNKED);
    keepAlive = HttpUtil.isKeepAlive(request);
    if (keepAlive) {
        response.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE);
    }/*from  ww  w  .j av  a2  s  .  co  m*/
}