[svn:mod_parrot] r567 - in mod_parrot/trunk: src/pmc t/response/TestAPI

[email protected] Thu, 1 Jan 2009 15:48:28 -0800 (PST)
Newsgroups perl.cvs.mod_parrot
Message-ID <[email protected]>
Author: jhorwitz
Date: Thu Jan  1 15:48:28 2009
New Revision: 567

Modified:
   mod_parrot/trunk/src/pmc/modparrothandle.pmc
   mod_parrot/trunk/t/response/TestAPI/modparrothandle.pir

Log:
implement readall method for ModParrotHandle


Modified: mod_parrot/trunk/src/pmc/modparrothandle.pmc
==============================================================================
--- mod_parrot/trunk/src/pmc/modparrothandle.pmc	(original)
+++ mod_parrot/trunk/src/pmc/modparrothandle.pmc	Thu Jan  1 15:48:28 2009
@@ -37,6 +37,8 @@
 #include "httpd.h"
 #include "http_protocol.h"
 
+#define MODPARROTHANDLE_READ_SIZE 1024
+
 pmclass ModParrotHandle dynpmc need_ext group modparrot_group {
     ATTR INTVAL  flags;               /* Filehandle flags             */
     ATTR STRING *mode;                /* The mode string used in open */
@@ -312,15 +314,62 @@
 
 /*
 
-=item METHOD readall(STRING *name);
+=item <METHOD readall(STRING *ignored)>
 
-TODO
+XXX
 
 =cut
 
 */
 
-/* readall code here */
+    METHOD readall(STRING *ignored) {
+        PMC *rpmc, *attrpmc;
+        STRING *result, *attrname;
+        request_rec *r;
+        apr_table_t *headers;
+        const char *buf;
+        int length, nread, total;
+
+        if (Parrot_io_is_closed_filehandle(INTERP, SELF)) {
+            Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_PIO_ERROR,
+                "Cannot readall without a request_rec object or open handle");
+        }
+
+        GET_ATTR_r(INTERP, SELF, rpmc);
+        if (!rpmc)
+            Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_PIO_ERROR,
+                "Cannot read from a closed filehandle");
+        attrname = const_string(INTERP, "r");
+        attrpmc = VTABLE_get_attr_str(INTERP, rpmc, attrname);
+        r = (request_rec *)PMC_data(attrpmc);
+
+        result = string_make_empty(INTERP, enum_stringrep_one, 0);
+        headers = r->headers_in;
+        buf = apr_table_get(headers, "Content-Length");
+        if (!buf) {
+            RETURN (STRING *result);
+        }
+        length = atoi(buf);
+        if (!length) {
+            RETURN (STRING *result);
+        }
+        do {
+            STRING * const part =
+                Parrot_io_reads(INTERP, SELF, MODPARROTHANDLE_READ_SIZE);
+            /* XXX is this reliably in bytes??? */
+            nread = string_length(INTERP, part);
+            if (nread) {
+                result = string_append(INTERP, result, part);
+            }
+            else {
+                /* prevent infinite loops.  this should never happen */
+                break;
+            }
+            total += nread;
+        } while (total < length);
+
+        RETURN(STRING *result);
+    }
 
 /*
 

Modified: mod_parrot/trunk/t/response/TestAPI/modparrothandle.pir
==============================================================================
--- mod_parrot/trunk/t/response/TestAPI/modparrothandle.pir	(original)
+++ mod_parrot/trunk/t/response/TestAPI/modparrothandle.pir	Thu Jan  1 15:48:28 2009
@@ -68,7 +68,14 @@
     r.'puts'("not ok 9 - readline # TODO\n")
 
   START_10:
-    r.'puts'("not ok 10 - readall # TODO\n")
+    push_eh NOT_OK_10
+    $S0 = fh.'readall'('')
+    pop_eh
+    if $S0 == "" goto OK_10
+  NOT_OK_10:
+    r.'puts'("not ")
+  OK_10:
+    r.'puts'("ok 10 - readall\n")
 
   START_11:
     fh.'setstdin'(old)