Ortwin Glück wrote:


Gordon Mohr wrote:
If I understand the HttpCore code properly, there is no direct facility for protecting against the OOME in the code -- just a chance to hook in a theoretical alternate implementation that would address the problem.

Is that correct?

Yes.

To use the HttpCore-4.0 facility, it appears I would create my own HttpDataReceiver implementation which keeps a count of the bytes it shovels & throws an IO or HTTP exception when some count is exceeded; create a factory that makes such receivers; install that factory into each HttpClientConnection instance before it begins receiving data.

Correct.

OK, thanks.

This could work, but seems a roundabout and obscure approach. The really valuable feature would be for OOME-resistance -- and friendly, usable indicators that extreme content has been encountered -- to be features of the library. It's require a switch or paramter to enable, rather than patching in custom/third-party code.

An OOM Exception is exactly that: a friendly usable indicator that an extreme condition has been encountered. I am personally against another mechanism that tries to somehow monitor heap memory.

I'd have to strongly disagree that OOMEs are friendly and usable. Among the reasons I consider it unfriendly:
 (1) OOMEs can occur anywhere, making it hard to catch and recover from
 (2) pre-JDK 1.6, there's no stack trace info
 (3) OOMEs only occasionally occur near the 'culpable' code

(3) is most troublesome for high-volume multi-threaded apps. If thread A is behaving nicely, using 1MB and freeing it, endlessly -- but then thread B comes along and grabs 1000MB, it's very possible that well-behaved A, not gluttonous B, receives the OOME. Given that A can be a crucial task whose unrecoverable error is fatal to your application, this is a serious and "unfriendly" problem.

(It's bitten my project constantly -- from HttpClient most recently, but several other open-source libraries as well.)

Thus it's nice to have libraries that at least have a mode where they use a practically bounded amount of memory. Some libraries do this well; I would like HttpClient(/HttpCore) to do whis well too, without requiring custom alternate implementations to be hooked in. It would make it a more robust library for many purposes.

I agree that by sending large header information a malicious server could DOS a spider based on HttpCore. So it makes sense for this use case to include a protection parameter that sets an upper limit to the information in headers. A default of 100 KB should be enough for the real world. This is the easy solution.

I agree. It wouldn't even need to be a default -- the default could be "take your chances", because the HTTP spec has no limits. But it'd be nice if setting such a limit were a built-in option.

My application currently requires a fix for this in the 3.x line, so I'll either use Christian's approach or work up my own. It'd be great to see this capability in 3.1, especially if it's HttpClient-3.1 is still pre-alpha and release ~4 months away.

If it can be opened as an RFE against 4.0, just to track that it's pending and a priority, I'd also be happy to contribute an implementation when my project gets around to using the 4.0 line (where we'll also need this).

Another possibility is to use a header stream like we do for the message body. This would mean a refactoring and probably cause painful client code. We would still have to protect ourselves against long header lines which is again not easy.

Thought about this too, but it'd be quite a contortion for a need -- truly handling arbitrarily long headers -- that's impractical if not completely mythical.

This all boils down to a missing feature: byte counting in the connection.

Agreed, that'd be one simple way to do it.

Is there a summary of expected dates of Core-4.0/Client-4.0 release somewhere, or any assessments of how the 4.0 codebases match up against 3.0 features? (Is it reasonable for an HttpClient-3.0-using project to consider transitioning to the 4.0 codebase(s)?)

This is the only plan there is:
http://wiki.apache.org/jakarta-httpclient/HttpComponentsProjectRoadmap

Great, thanks.

- Gordon @ IA

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to