note
afoken
<p>OK, it's HTTP server push. I haven't seen that in the wild until now. That should be handled by LWP. Unfortunately, LWP is mostly designed to receive a single document from an HTTP request, not a (possible infinite) steam of documents wrapped in a <c>multipart/mixed</c> container.</p>
<p>The <c>:content_cb</c> callback in your original code is a way to hook into [mod://LWP::UserAgent], but it looks a bit scary. LWP documents that the callback is called with "a chunk of data". That may be everything from a single byte to a large block containing several documents and headers. Your code treats that "chunk of data" first as exactly one document with HTTP and multipart headers (in <c>$data =~ /^--boundary/</c>), then as a full XML document (in <c>$twig->parse($data);</c>).</p>
<p>This may "just work" because (a) the camera waits sufficiently long times between each part of the multipart container, (b) the XML document is very small, and (c) the <c>:read_size_hint</c> is sufficiently large to make <c>LWP::UserAgent</c> read the entire document, including headers, into one chunk.</p>
<p>A less scary version would collect chunks somewhere (e.g. in a private attribute of the <c>$response</c> object) until at least one complete document with HTTP and multipart headers was collected. Then, it should extract headers and the raw document
from there (e.g. into a new [mod://HTTP::Response] object), and only then call <c>$twig->parse($document)</c>, perhaps as another callback.</p>
<p>Maybe that could be made into a separate module that extends <c>LWP::UserAgent</c> to handle multipart document streams.</p>
<p>Alexander</p>
<div class="pmsig"><div class="pmsig-747201">
--<br>
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)
</div></div>
1132165
1133208