<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none"><!--P{margin-top:0;margin-bottom:0;} .ms-cui-menu {background-color:#ffffff;border:1px rgb(166, 166, 166) solid;font-family:'Segoe UI','Segoe WP','Segoe UI WPC',Tahoma,Arial,sans-serif;font-size:10pt;color:rgb(51, 51, 51);z-index: 1000;} .ms-cui-menusection-title {display:none;} .ms-cui-ctl {vertical-align:text-top;text-decoration:none;color:rgb(51, 51, 51);} .ms-cui-ctl-on {background-color:rgb(205, 230, 247);opacity: 0.8;} .ms-cui-img-cont-float {display:inline-block;margin-top:2px} .ms-cui-smenu-inner {padding-top:0px;} .ms-owa-paste-option-icon {margin: 0px 6px 0px 6px;vertical-align:middle!important;padding-bottom: 2px;display:inline-block;} .ms-rtePasteFlyout-option:hover {background-color:rgb(205, 230, 247) !important;opacity:1 !important;} .ms-rtePasteFlyout-option {padding:8px 4px 8px 4px;outline:none;} .ms-cui-menusection {float:left; width:85px;height:24px;overflow:hidden}.wf {speak:none; font-weight:normal; font-variant:normal; text-transform:none; -webkit-font-smoothing:antialiased; vertical-align:middle; display:inline-block;}.wf-family-owa {font-family:'o365Icons'}@font-face {  font-family:'o365IconsIE8';  src:url('https://r4.res.outlook.com/owa/prem/16.0.347.7/resources/styles/office365icons.ie8.eot?#iefix') format('embedded-opentype'),         url('https://r4.res.outlook.com/owa/prem/16.0.347.7/resources/styles/office365icons.ie8.woff') format('woff'),         url('https://r4.res.outlook.com/owa/prem/16.0.347.7/resources/styles/office365icons.ie8.ttf') format('truetype');  font-weight:normal;  font-style:normal;}@font-face {  font-family:'o365IconsMouse';  src:url('https://r4.res.outlook.com/owa/prem/16.0.347.7/resources/styles/office365icons.mouse.eot?#iefix') format('embedded-opentype'),         url('https://r4.res.outlook.com/owa/prem/16.0.347.7/resources/styles/office365icons.mouse.woff') format('woff'),         url('https://r4.res.outlook.com/owa/prem/16.0.347.7/resources/styles/office365icons.mouse.ttf') format('truetype');  font-weight:normal;  font-style:normal;}.wf-family-owa {font-family:'o365IconsMouse'}.ie8 .wf-family-owa {font-family:'o365IconsIE8'}.ie8 .wf-owa-play-large:before {content:'\e254';}.notIE8 .wf-owa-play-large:before {content:'\e054';}.ie8 .wf-owa-play-large {color:#FFFFFF/*$WFWhiteColor*/;}.notIE8 .wf-owa-play-large {border-color:#FFFFFF/*$WFWhiteColor*/; width:1.4em; height:1.4em; border-width:.1em; border-style:solid; border-radius:.8em; text-align:center; box-sizing:border-box; -moz-box-sizing:border-box; padding:0.1em; color:#FFFFFF/*$WFWhiteColor*/;}.ie8 .wf-size-play-large {width:40px; height:40px; font-size:30px}.notIE8 .wf-size-play-large {width:40px; height:40px; font-size:30px}.notIE8 .wf-owa-triangle-down-small:before {content:'\e052';}.ie8 .wf-owa-triangle-down-small:before { content:'\e052';}.ie8 .wf-owa-triangle-down-small {color:#666666/*$WFGreyColor*/;}.wf-size-x20 {font-size: 20px!important;}--></style>
</head>
<body dir="ltr" style="font-size:12pt;color:#000000;background-color:#FFFFFF;font-family:Calibri,Arial,Helvetica,sans-serif;">
<p><br>
</p>
<div style="color: rgb(33, 33, 33);">
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="divRplyFwdMsg" dir="ltr"><font style="font-size:11pt" color="#000000" face="Calibri, sans-serif"><b>From:</b> Andy Green <andy.green@linaro.org><br>
<b>Sent:</b> Tuesday, August 19, 2014 12:43 PM<br>
<b>To:</b> Steve Calfee; libwebsockets@ml.libwebsockets.org<br>
<b>Subject:</b> RE: [Libwebsockets] two part html</font>
<div> </div>
</div>
<div>
<p dir="ltr"><br>
On 20 Aug 2014 02:08, "Steve Calfee" <<a href="mailto:scalfee@mqidentity.com">scalfee@mqidentity.com</a>> wrote:<br>
><br>
> ________________________________________<br>
> From: Andy Green <<a href="mailto:extracats@googlemail.com">extracats@googlemail.com</a>> on behalf of Andy Green <<a href="mailto:andy@warmcat.com">andy@warmcat.com</a>><br>
> Sent: Monday, August 18, 2014 9:13 PM<br>
> To: Steve Calfee; <a href="mailto:libwebsockets@ml.libwebsockets.org">libwebsockets@ml.libwebsockets.org</a><br>
> Subject: Re: [Libwebsockets] two part html<br>
><br>
> On 19 August 2014 10:53:37 GMT+08:00, Steve Calfee <<a href="mailto:scalfee@mqidentity.com">scalfee@mqidentity.com</a>> wrote:<br>
> >Hi,<br>
> ><br>
> >I think I can do this, but I am not sure. I would like to send a html<br>
> >file with the lws sendfile capability. Then I want to send a string of<br>
> >json I built in my app as the rest of the html.<br>
> ><br>
> >I think all I have to do is when sendfile is done, return 0; then on<br>
> >the next http callback I can send my data. If that is true, what<br>
> >callback code will I get to indicate it is time for me to send my<br>
> >little computed data?<br>
><br>
> If I understood it, LWS_CALLBACK_HTTP_WRITEABLE.<br>
><br>
> But you will get trouble I think, if sending the file sets the content length header the transaction is over after that much was sent.<br>
><br>
> -Andy<br>
><br>
> Hi Andy,<br>
><br>
> Who sets the content-length field? I don't have the source here, but I will check it later. If it is set by the lws_sendfile routine, I guess I cannot do it that way.<br>
><br>
> As a simpler example, say I split a html file arbitrarily in the middle, into 2 files. Then in the http callback I call the lws_sendfile routine twice. Would that work?<br>
><br>
> Thanks, Steve<br>
><br>
> Hi Andy,<br>
><br>
> A follow up. I can now see the source and indeed libwebsockets_serve_http_file sets the content-length so I cannot use it to send two parts. I will have to roll my own.<br>
><br>
> I don't understand the lws rules on private routines. Can I unroll the big  libwebsockets_serve_http_file by explicitly handling the start of the send?  And then use "LWS_VISIBLE int libwebsockets_serve_http_file_fragment(..." or is that a private function
 that should not be used by user level code?<br>
><br>
> It isn't that big a deal to do it explicitly in my code, but I always like to reuse code from libraries if it is possible.</p>
<p dir="ltr">It's separated out like that to indicate we'll make an effort to maintain the public ones in a way that they still look pretty much the same if possible in later versions.</p>
<p dir="ltr">The private ones have no such promise they may change or disappear at any time.</p>
<p dir="ltr">And it's less confusing if people can read libwebsockets.h to understand what is available.<br>
</p>
<p dir="ltr">I think your approach might not be the right way.</p>
<p dir="ltr">How about put your payload in a cookie header or somesuch and just send the file simply?</p>
<p dir="ltr">Or if you don't send this stuff very often, pick it up in two separate http requests at different uri paths?</p>
<p dir="ltr">Either way your code gets simpler, more testable and more reliable.</p>
<p dir="ltr">-Andy</p>
<p dir="ltr"><br>
</p>
<p dir="ltr">Hi Andy,</p>
<p dir="ltr"><br>
</p>
<p dir="ltr">I agree intentionally private stuff should stay private. </p>
<p dir="ltr"><br>
</p>
<p dir="ltr">I don't know how a user can load one web page using two separate http requests.</p>
<p dir="ltr"><br>
</p>
<p dir="ltr">Also, I don't know how a cookie header could add json or javascript to a web page?</p>
<p dir="ltr"><br>
</p>
<p dir="ltr">The simplest way to think of it is I want a browser to get two separate html files in one http connection. I think the only way to do this is to read the files in the http callback and do two (or more) sends using something very like  libwebsockets_serve_http_file,
 but that does match my peculiar needs.</p>
<p dir="ltr"><br>
</p>
<p dir="ltr">Steve<br>
</p>
</div>
</div>
</body>
</html>