internal static void debugLogHeaders(DotNetty.Codecs.Http.HttpHeaders headers, ILogger log, string type) { if (log.IsDebugEnabled && !headers.GetEnumerator().MoveNext()) { List <HeaderEntry <AsciiString, ICharSequence> > .Enumerator e = (List <HeaderEntry <AsciiString, ICharSequence> > .Enumerator)headers.GetEnumerator(); while (e.MoveNext()) { HeaderEntry <AsciiString, ICharSequence> l = e.Current; } } }
public DefaultFullHttpResponse(HttpVersion version, HttpResponseStatus status, IByteBuffer content, HttpHeaders headers, HttpHeaders trailingHeaders) : base(version, status, headers) { Contract.Requires(content != null); Contract.Requires(trailingHeaders != null); this.content = content; this.trailingHeaders = trailingHeaders; }
protected override void Decode(IChannelHandlerContext context, IHttpObject message, List <object> output) { if (message is IHttpResponse response && response.Status.Code == 100) { if (!(response is ILastHttpContent)) { this.continueResponse = true; } // 100-continue response must be passed through. output.Add(ReferenceCountUtil.Retain(message)); return; } if (this.continueResponse) { if (message is ILastHttpContent) { this.continueResponse = false; } // 100-continue response must be passed through. output.Add(ReferenceCountUtil.Retain(message)); return; } if (message is IHttpMessage httpMessage) { this.Cleanup(); HttpHeaders headers = httpMessage.Headers; // Determine the content encoding. if (headers.TryGet(HttpHeaderNames.ContentEncoding, out ICharSequence contentEncoding)) { contentEncoding = AsciiString.Trim(contentEncoding); } else { contentEncoding = Identity; } this.decoder = this.NewContentDecoder(contentEncoding); if (this.decoder == null) { if (httpMessage is IHttpContent httpContent) { httpContent.Retain(); } output.Add(httpMessage); return; } // Remove content-length header: // the correct value can be set only after all chunks are processed/decoded. // If buffering is not an issue, add HttpObjectAggregator down the chain, it will set the header. // Otherwise, rely on LastHttpContent message. if (headers.Contains(HttpHeaderNames.ContentLength)) { headers.Remove(HttpHeaderNames.ContentLength); headers.Set(HttpHeaderNames.TransferEncoding, HttpHeaderValues.Chunked); } // Either it is already chunked or EOF terminated. // See https://github.com/netty/netty/issues/5892 // set new content encoding, ICharSequence targetContentEncoding = this.GetTargetContentEncoding(contentEncoding); if (HttpHeaderValues.Identity.ContentEquals(targetContentEncoding)) { // Do NOT set the 'Content-Encoding' header if the target encoding is 'identity' // as per: http://tools.ietf.org/html/rfc2616#section-14.11 headers.Remove(HttpHeaderNames.ContentEncoding); } else { headers.Set(HttpHeaderNames.ContentEncoding, targetContentEncoding); } if (httpMessage is IHttpContent) { // If message is a full request or response object (headers + data), don't copy data part into out. // Output headers only; data part will be decoded below. // Note: "copy" object must not be an instance of LastHttpContent class, // as this would (erroneously) indicate the end of the HttpMessage to other handlers. IHttpMessage copy; if (httpMessage is IHttpRequest req) { // HttpRequest or FullHttpRequest copy = new DefaultHttpRequest(req.ProtocolVersion, req.Method, req.Uri); } else if (httpMessage is IHttpResponse res) { // HttpResponse or FullHttpResponse copy = new DefaultHttpResponse(res.ProtocolVersion, res.Status); } else { throw new CodecException($"Object of class {StringUtil.SimpleClassName(httpMessage.GetType())} is not a HttpRequest or HttpResponse"); } copy.Headers.Set(httpMessage.Headers); copy.Result = httpMessage.Result; output.Add(copy); } else { output.Add(httpMessage); } } if (message is IHttpContent c) { if (this.decoder == null) { output.Add(c.Retain()); } else { this.DecodeContent(c, output); } } }
public DefaultLastHttpContent(IByteBuffer content, bool validateHeaders) : base(content) { this.trailingHeaders = new TrailingHttpHeaders(validateHeaders); this.validateHeaders = validateHeaders; }