> On Jan 30, 2017, at 19:44, Kevin Mcintyre <kebi...@gmail.com> wrote:
> On Mon, Jan 30, 2017 at 4:59 PM, Jean-Paul Calderone
> <exar...@twistedmatrix.com <mailto:exar...@twistedmatrix.com>> wrote:
>
> On Mon, Jan 30, 2017 at 7:44 PM, Glyph Lefkowitz <gl...@twistedmatrix.com
> <mailto:gl...@twistedmatrix.com>> wrote:
> Gotcha. I guess what I meant was that you shouldn't care about this at the
> application level, but you're talking about an operational concern, not an
> application-level concern.
>
> Perhaps this should be a tunable on Agent somehow. Can you file a ticket?
>
>
> Well... It is sort of tuneable, as you implied earlier.
>
> If you pass an IBodyProducer with a non-None length, Agent will send a
> Content-Length header - not use chunked Transfer-Encoding. FileBodyProducer
> doesn't know how to determine the length of a StringIO, so you get chunked
> with this example.
Not quite true: FileBodyProducer does know how to compute the length of a
StringIO, via seek():
>>> from twisted.web.client import FileBodyProducer
>>> from io import BytesIO
>>> from cStringIO import StringIO
>>> FileBodyProducer(BytesIO(b"some bytes")).length
10L
>>> FileBodyProducer(StringIO(b"some bytes")).length
10
> If you write the JSON to a regular file and FileBodyProducer(open(the file))
> you'll get a Content-Length request. You could also write a new (trivial)
> IBodyProducer that does know how to compute the length of a StringIO.
>
> The documentation doesn't exactly spell this out - but the only reason
> `length` is part of the interface is to be able to generate the
> Content-Length header.
>
> What would the ticket be? Expanded documentation to make this behavior into
> an explicit guarantee of the interface? A new toggle somewhere to force
> Agent.request into one mode or the other (regardless of the performance
> consequences)?
Rather than "regardless" of the consequences, perhaps just a maximum body size.
If we made it an explicit guarantee in Agent, perhaps the interface change
would not be in '.request' (which, as a formal interface used both inside and
outside of Twisted, is fairly fixed), but rather a new `NonChunkedBodyProducer`
concrete class that would implement IBodyProducer in terms of another
IBodyProducer which either does or doesn't have a `length`. (Or a function
that does same, always returning its argument if `length` is already set...)
> And that stuff you said about proxies before was true ... So even if you can
> control this in Agent, you're still not guaranteed the server will see what
> you send.
> Thanks - that's exactly what I was looking for.
>
> But note when using FileBodyProducer(StringIO(json.dumps(~blah))) -- I still
> see a content-length in the request header as it's received by twisted. Am I
> correct to assume the request is agnostic...meaning it's shaped the same for
> twisted as it is for apache.
It is shaped the same. The reason you're seeing the error is due to the issue
I pointed out above.
> Headers({'host': ['localhost:8080'], 'connection': ['close'],
> 'content-length': ['671'], 'user-agent': ['PassengerTest']})
>
-glyph
_______________________________________________
Twisted-Python mailing list
Twisted-Python@twistedmatrix.com
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python