/// <exception cref="Org.Apache.Http.HttpException"></exception> public override long DetermineLength(HttpMessage message) { Args.NotNull(message, "HTTP message"); // Although Transfer-Encoding is specified as a list, in practice // it is either missing or has the single value "chunked". So we // treat it as a single-valued header here. Header transferEncodingHeader = message.GetFirstHeader(HTTP.TransferEncoding); if (transferEncodingHeader != null) { string s = transferEncodingHeader.GetValue(); if (Sharpen.Runtime.EqualsIgnoreCase(HTTP.ChunkCoding, s)) { if (message.GetProtocolVersion().LessEquals(HttpVersion.Http10)) { throw new ProtocolException("Chunked transfer encoding not allowed for " + message .GetProtocolVersion()); } return(Chunked); } else { if (Sharpen.Runtime.EqualsIgnoreCase(HTTP.IdentityCoding, s)) { return(Identity); } else { throw new ProtocolException("Unsupported transfer encoding: " + s); } } } Header contentLengthHeader = message.GetFirstHeader(HTTP.ContentLen); if (contentLengthHeader != null) { string s = contentLengthHeader.GetValue(); try { long len = long.Parse(s); if (len < 0) { throw new ProtocolException("Negative content length: " + s); } return(len); } catch (FormatException) { throw new ProtocolException("Invalid content length: " + s); } } return(this.implicitLen); }
/// <exception cref="Org.Apache.Http.HttpException"></exception> protected internal virtual HttpEntity PrepareInput(HttpMessage message) { BasicHttpEntity entity = new BasicHttpEntity(); long len = this.incomingContentStrategy.DetermineLength(message); InputStream instream = CreateInputStream(len, this.inbuffer); if (len == ContentLengthStrategy.Chunked) { entity.SetChunked(true); entity.SetContentLength(-1); entity.SetContent(instream); } else { if (len == ContentLengthStrategy.Identity) { entity.SetChunked(false); entity.SetContentLength(-1); entity.SetContent(instream); } else { entity.SetChunked(false); entity.SetContentLength(len); entity.SetContent(instream); } } Header contentTypeHeader = message.GetFirstHeader(HTTP.ContentType); if (contentTypeHeader != null) { entity.SetContentType(contentTypeHeader); } Header contentEncodingHeader = message.GetFirstHeader(HTTP.ContentEncoding); if (contentEncodingHeader != null) { entity.SetContentEncoding(contentEncodingHeader); } return(entity); }
/// <exception cref="Org.Apache.Http.HttpException"></exception> public override long DetermineLength(HttpMessage message) { Args.NotNull(message, "HTTP message"); Header transferEncodingHeader = message.GetFirstHeader(HTTP.TransferEncoding); // We use Transfer-Encoding if present and ignore Content-Length. // RFC2616, 4.4 item number 3 if (transferEncodingHeader != null) { HeaderElement[] encodings; try { encodings = transferEncodingHeader.GetElements(); } catch (ParseException px) { throw new ProtocolException("Invalid Transfer-Encoding header value: " + transferEncodingHeader , px); } // The chunked encoding must be the last one applied RFC2616, 14.41 int len = encodings.Length; if (Sharpen.Runtime.EqualsIgnoreCase(HTTP.IdentityCoding, transferEncodingHeader. GetValue())) { return Identity; } else { if ((len > 0) && (Sharpen.Runtime.EqualsIgnoreCase(HTTP.ChunkCoding, encodings[len - 1].GetName()))) { return Chunked; } else { return Identity; } } } Header contentLengthHeader = message.GetFirstHeader(HTTP.ContentLen); if (contentLengthHeader != null) { long contentlen = -1; Header[] headers = message.GetHeaders(HTTP.ContentLen); for (int i = headers.Length - 1; i >= 0; i--) { Header header = headers[i]; try { contentlen = long.Parse(header.GetValue()); break; } catch (FormatException) { } } // See if we can have better luck with another header, if present if (contentlen >= 0) { return contentlen; } else { return Identity; } } return this.implicitLen; }