public IByteBufferHolder Replace(IByteBuffer content) { var dup = new DefaultLastHttpContent(content); _ = dup.TrailingHeaders.SetAll(this.trailingHeaders); return(dup); }
public IByteBufferHolder Copy() { var content = new DefaultLastHttpContent(Unpooled.Empty); _ = content.TrailingHeaders.Set(this.trailingHeaders); return(content); }
ILastHttpContent ReadTrailingHeaders(IByteBuffer buffer) { AppendableCharSequence line = this.headerParser.Parse(buffer); if (line == null) { return(null); } AsciiString lastHeader = null; if (line.Count > 0) { ILastHttpContent trailingHeaders = this.trailer; if (trailingHeaders == null) { trailingHeaders = new DefaultLastHttpContent(Unpooled.Empty, this.ValidateHeaders); this.trailer = trailingHeaders; } do { byte firstChar = line.Bytes[0]; if (lastHeader != null && (firstChar == ' ' || firstChar == '\t')) { IList <ICharSequence> current = trailingHeaders.TrailingHeaders.GetAll(lastHeader); if (current.Count > 0) { int lastPos = current.Count - 1; ICharSequence lineTrimmed = CharUtil.Trim(line); current[lastPos] = new AsciiString($"{current[lastPos]} {lineTrimmed}"); } } else { this.SplitHeader(line); AsciiString headerName = this.name; if (!HttpHeaderNames.ContentLength.ContentEqualsIgnoreCase(headerName) && !HttpHeaderNames.TransferEncoding.ContentEqualsIgnoreCase(headerName) && !HttpHeaderNames.Trailer.ContentEqualsIgnoreCase(headerName)) { trailingHeaders.TrailingHeaders.Add(headerName, this.value); } lastHeader = this.name; // reset name and value fields this.name = null; this.value = null; } line = this.headerParser.Parse(buffer); if (line == null) { return(null); } } while (line.Count > 0); this.trailer = null; return(trailingHeaders); } return(EmptyLastHttpContent.Default); }
public override IByteBufferHolder Replace(IByteBuffer buffer) { var dup = new DefaultLastHttpContent(this.Content, this.validateHeaders); _ = dup.TrailingHeaders.Set(this.trailingHeaders); return(dup); }
IHttpContent InvalidChunk(IByteBuffer buf, Exception cause) { this.currentState = State.BadMessage; // Advance the readerIndex so that ByteToMessageDecoder does not complain // when we produced an invalid message without consuming anything. buf.SkipBytes(buf.ReadableBytes); IHttpContent chunk = new DefaultLastHttpContent(Unpooled.Empty); chunk.Result = DecoderResult.Failure(cause); this.message = null; this.trailer = null; return(chunk); }
private ILastHttpContent ReadTrailingHeaders(IByteBuffer buffer) { AppendableCharSequence line = _headerParser.Parse(buffer); if (line is null) { return(null); } ILastHttpContent trailingHeaders = _trailer; if (0u >= (uint)line.Count && trailingHeaders is null) { // We have received the empty line which signals the trailer is complete and did not parse any trailers // before. Just return an empty last content to reduce allocations. return(EmptyLastHttpContent.Default); } AsciiString lastHeader = null; if (trailingHeaders is null) { trailingHeaders = new DefaultLastHttpContent(Unpooled.Empty, ValidateHeaders); _trailer = trailingHeaders; } while ((uint)line.Count > 0u) { byte firstChar = line.Bytes[0]; if (lastHeader is object && (firstChar == c_space || firstChar == c_tab)) { IList <ICharSequence> current = trailingHeaders.TrailingHeaders.GetAll(lastHeader); if ((uint)current.Count > 0u) { int lastPos = current.Count - 1; //please do not make one line from below code //as it breaks +XX:OptimizeStringConcat optimization ICharSequence lineTrimmed = CharUtil.Trim(line); current[lastPos] = new AsciiString($"{current[lastPos]}{lineTrimmed}"); } } else { SplitHeader(line); AsciiString headerName = _name; if (!HttpHeaderNames.ContentLength.ContentEqualsIgnoreCase(headerName) && !HttpHeaderNames.TransferEncoding.ContentEqualsIgnoreCase(headerName) && !HttpHeaderNames.Trailer.ContentEqualsIgnoreCase(headerName)) { _ = trailingHeaders.TrailingHeaders.Add(headerName, _value); } lastHeader = _name; // reset name and value fields _name = null; _value = null; } line = _headerParser.Parse(buffer); if (line is null) { return(null); } } _trailer = null; return(trailingHeaders); }