Hi,

I have developed an tested a mod_include.c improvement (httpd 2.2.15).


The module can now handle the "include uvirtual" command, where "uvirtual"
means "unbuffered".

If command is "include virtual" and 200 OK there is a call to ap_rflush(r).

I had this idea because is useful to send chunk (also with gzip) in a
controlled way to force the browser rendering with simple html files! Yes I
love static files ;-)


Scenario:

1 html file with 3 includes, nested included not tested now.


Browsers behavior:

* Chrome and Safari (also with iPhone) need more bytes before starting the
render task.
* Explorer 8 and Firefox are ok with a few bytes.




Here is an .html example:

<html>
<body>
<!--#include uvirtual="/header.html" -->
<hr>
<!-- 4 seconds sleep -->
<!--#include virtual="/sleep.php" -->
<!--#include virtual="/content.html" -->


</body>
</html>


The header comes first and then (4 seconds later) the content.



I'd love any feedback!



Massimiliano Pinto

IT Specialist
Banzai Consulting s.r.l.
Milan, ITALY


P.S:

here is the patch

Index: httpd-trunk/modules/filters/mod_include.c
===================================================================
--- httpd-trunk/modules/filters/mod_include.c   (revision 942722)
+++ httpd-trunk/modules/filters/mod_include.c   (working copy)
@@ -1060,8 +1060,9 @@
         if (!tag || !tag_val) {
             break;
         }
-
-        if (strcmp(tag, "virtual") && strcmp(tag, "file")) {
+
+       /* added uvirtual for unbuffered include virtual */
+        if (strcmp(tag, "virtual") && strcmp(tag, "file") && strcmp(tag,
"uvirtual")) {
             ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "unknown parameter "
                           "\"%s\" to tag include in %s", tag, r->filename);
             SSI_CREATE_ERROR_BUCKET(ctx, f, bb);
@@ -1130,6 +1131,11 @@
         if (error_fmt) {
             break;
         }
+
+        /* if all ok and tag is uvirtual do the flush! */
+        if (tag[0] == 'u') {
+                ap_rflush(r);
+        }
     }

     return APR_SUCCESS;

Reply via email to