Hi!

On Mon, Jun 28, 2010 at 4:26 PM, Ludwig Isaac Lim <[email protected]> wrote:
> Hi:
>
>     I'm writing a web-app Ajax and perl. Outputs of the server are either in
> JSON or CSV.

[...]

>      My problem is if output_JSON is called twice (or output_Excel is called
> after an output_JSON), the CGI headers are included in the data (not headers)
> send back to client, thus making the data un-parsable or corrupt. I was able 
> to
> verify that the HTTP headers got included in data via means Firebug plugin for
> firefox.
>

[...]

>
>    I'm running the whole stuff on Perl 5.8.0, and on an antiquated version of
> Apache (1.x series), and HP-UX. Any ideas? I already spend a lot of time
> googling on "CGI" and "HTTP"

If not because you're on 5.8.0, I'd suggest using Mojolicious,[0] as
it has native JSON output (and also WriteExcel support, via my shiny
new MojoX::Renderer::WriteExcel[1] which I'm still improving on ;)

[0]  http://mojolicious.org
[1]  http://search.cpan.org/dist/MojoX-Renderer-WriteExcel/

As you're on 5.8.0, I presume your $CGI::VERSION is 2.81 (unless you
upgraded it.)  Checking both perldelta and CGI.pm's Changes,[2] there
are a few behavior changes in $cgi->header() so you might want to look
at the list, and possibly upgrade.

[2] http://cpansearch.perl.org/src/LDS/CGI.pm-3.49/Changes

Anyway, looking at your subs above, I see that you print your data to
different filehandles, while your $cgi->header() call prints to the
default filehandle (presumably STDOUT).  Maybe that's where your
problem is?

Or maybe, just maybe, those filehandles after print are actually
functions :P  If that's the case, then you're calling them wrong,
because print() will treat those as filehandles (e.g. print()'s first
form,

print FILEHANDLE LIST

in `perldoc -f print'.)  You should be calling them like

print json_encode($ref_data);

Thinking about it more, I also see your output_* functions repeat a
basic function: set a header then print data.  I think a better
approach would be to have a hash that collects these info (headers and
data) then pass this hash to a generic renderer function that does all
the output for you in one section of code.  Come to think of it, this
is exactly the way Mojolicious does this (via MojoX::Renderer).

-- 
Zak B. Elep  ||  zakame.net
1486 7957 454D E529 E4F1  F75E 5787 B1FD FA53 851D
_________________________________________________
Philippine Linux Users' Group (PLUG) Mailing List
http://lists.linux.org.ph/mailman/listinfo/plug
Searchable Archives: http://archives.free.net.ph

Reply via email to