/// <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);
        }
Ejemplo n.º 3
0
		/// <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;
		}