Loading ...
Sorry, an error occurred while loading the content.

Re: compile mod_perl with Apache::DBI support

Expand Messages
  • Stas Bekman
    ... jiesheng, please read the module s manpage: http://search.cpan.org/dist/Apache-DBI/DBI.pm To enable debugging the variable $Apache::DBI::DEBUG must be set.
    Message 1 of 27 , May 1, 2005
    • 0 Attachment
      jiesheng zhang wrote:
      > I am using the SuSE 9.1 which has apache 2.0 and mod_perl 1.99_12.
      > I did not see any Apache::DBI debug information in the apache error log.

      jiesheng, please read the module's manpage:
      http://search.cpan.org/dist/Apache-DBI/DBI.pm

      To enable debugging the variable $Apache::DBI::DEBUG must be set.
      This can either be done in startup.pl or in the user script. Setting
      the variable to 1, just reports about a new connect. Setting the
      variable to 2 enables full debug output.

      > I guessED the the mod_perl is not complied with the
      > EVERYTHING=1 option. I then tried to compile the mod_perl to support
      > Apache::DBI
      > The perl configuration command is like
      >
      > perl Makefile.PL MP_APXS=/usr/sbin/apxs2 MP_CCOPTS="-O2 -march=i586
      > -mcpu=i686 -fmessage-length=0 -Wall -fPIC -Wall -fno-strict-aliasing
      > -D_LARGEFILE_SOURCE" EVERYTHING=1
      >
      > However, I got this error
      > ------------------------------------------------------
      > Reading Makefile.PL args from @ARGV
      > MP_APXS = /usr/sbin/apxs2
      > MP_CCOPTS = -O2 -march=i586 -mcpu=i686 -fmessage-length=0 -Wall -fPIC
      > -Wall -fno-strict-aliasing -D_LARGEFILE_SOURCE
      > Configuring Apache/2.0.49 mod_perl/1.99_13-dev Perl/v5.8.3
      > 'EVERYTHING' is not a known MakeMaker parameter name.
      > -----------------------------------------------------------------------------
      >
      > I also checked the mod_perl build instruction for mod_perl 2.0. It does
      > not mention anything about the option "EVERYTHING".

      Because it doesn't exist and not needed in mp2. Why were you trying to do
      that?

      --
      __________________________________________________________________
      Stas Bekman JAm_pH ------> Just Another mod_perl Hacker
      http://stason.org/ mod_perl Guide ---> http://perl.apache.org
      mailto:stas@... http://use.perl.org http://apacheweek.com
      http://modperlbook.org http://apache.org http://ticketmaster.com
    • Stas Bekman
      ... That s right. ... Use must use $r- set_content_length(). See the mp2 test suite for examples. --
      Message 2 of 27 , May 1, 2005
      • 0 Attachment
        allan juul wrote:
        > hi stas
        >
        > Stas Bekman wrote:
        >
        >> allan juul wrote:
        >> [...]
        >
        >
        >>>> But if you use a mod_perl filter you will still hit the issue of
        >>>> unknown content-length header.
        >>>
        >>>
        >>>
        >>>
        >>> yes, of course that's true.
        >>> there goes caching (:
        >>
        >>
        >>
        >> Not really. Nothing prevents you from buffering up the response,
        >> process it, set the content-length header and make the document
        >> cache-able.
        >
        >
        > ok, eh how do i that. you mean instead of printing to STDOUT, collect
        > data in a buffer, then set the calculated Content-Length, then print data?

        That's right.

        > anyway, it's pretty strange. it seems i'm able to set the Content-Length
        > when i use the mod_perl_filter and do *not* reverse proxy. see both
        > headers below. the strange things is that i'm not allowed at all to set
        > the standard Content-Length, but indeed allowed to set a custom one
        > called Content-Length2. and even stranger is that this custom header
        > presents a correct value when *not* proxying but "0" when proxying. i
        > use the exact same mod_perl code, also supplied below. the actual
        > filtering of data content works in both cases.

        Use must use $r->set_content_length(). See the mp2 test suite for examples.



        --
        __________________________________________________________________
        Stas Bekman JAm_pH ------> Just Another mod_perl Hacker
        http://stason.org/ mod_perl Guide ---> http://perl.apache.org
        mailto:stas@... http://use.perl.org http://apacheweek.com
        http://modperlbook.org http://apache.org http://ticketmaster.com
      • jiesheng zhang
        ... I indeed set the $Apache::DBI::DEBUG=2 in the /etc/apache2/mod_perl-startup.pl. However I did not see any debug output in the apache error log file
        Message 3 of 27 , May 2, 2005
        • 0 Attachment
          >> I am using the SuSE 9.1 which has apache 2.0 and mod_perl 1.99_12.
          >> I did not see any Apache::DBI debug information in the apache error log.
          >
          >
          > jiesheng, please read the module's manpage:
          > http://search.cpan.org/dist/Apache-DBI/DBI.pm
          >
          > To enable debugging the variable $Apache::DBI::DEBUG must be set.
          > This can either be done in startup.pl or in the user script. Setting
          > the variable to 1, just reports about a new connect. Setting the
          > variable to 2 enables full debug output.

          I indeed set the $Apache::DBI::DEBUG=2 in the
          /etc/apache2/mod_perl-startup.pl. However I did not see any debug output
          in the apache error log file
        • Perrin Harkins
          ... Did you use Apache::DBI in your startup.pl or httpd.conf? I think you re not understanding that Apache::DBI is a pure Perl module which you load in the
          Message 4 of 27 , May 2, 2005
          • 0 Attachment
            On Mon, 2005-05-02 at 20:10 +0800, jiesheng zhang wrote:
            > I indeed set the $Apache::DBI::DEBUG=2 in the
            > /etc/apache2/mod_perl-startup.pl. However I did not see any debug output
            > in the apache error log file

            Did you "use Apache::DBI" in your startup.pl or httpd.conf?

            I think you're not understanding that Apache::DBI is a pure Perl module
            which you load in the normal way, not a part of mod_perl. You do not
            need to recompile mod_perl in order to use Apache::DBI.

            - Perrin
          • jiesheng zhang
            ... I saw debug information in the apache log file after I added the use Apache::DBI to the startup.pl. However, this is not mentioned in the Apache::DBI
            Message 5 of 27 , May 2, 2005
            • 0 Attachment
              Perrin Harkins wrote:

              >On Mon, 2005-05-02 at 20:10 +0800, jiesheng zhang wrote:
              >
              >
              >>I indeed set the $Apache::DBI::DEBUG=2 in the
              >>/etc/apache2/mod_perl-startup.pl. However I did not see any debug output
              >>in the apache error log file
              >>
              >>
              >
              >Did you "use Apache::DBI" in your startup.pl or httpd.conf?
              >
              >
              >
              I saw debug information in the apache log file after I added the

              use Apache::DBI to the startup.pl. However, this is not mentioned in the Apache::DBI documentation. The documentation only mentioned that I should add
              PerlModule Apache::DBI to the http.conf.



              >I think you're not understanding that Apache::DBI is a pure Perl module
              >which you load in the normal way, not a part of mod_perl. You do not
              >need to recompile mod_perl in order to use Apache::DBI.
              >
              >- Perrin
              >
              >
              >

              Thanks
            • Perrin Harkins
              ... Either way works. If you were doing it with PerlModule before, you should have seen the debug information. - Perrin
              Message 6 of 27 , May 2, 2005
              • 0 Attachment
                On Tue, 2005-05-03 at 00:21 +0800, jiesheng zhang wrote:
                > I saw debug information in the apache log file after I added the
                >
                > use Apache::DBI to the startup.pl. However, this is not mentioned in the Apache::DBI documentation. The documentation only mentioned that I should add
                > PerlModule Apache::DBI to the http.conf.

                Either way works. If you were doing it with PerlModule before, you
                should have seen the debug information.

                - Perrin
              • jiesheng zhang
                ... The PerlModule seemed not working in my system. My system is suse 9.1, apache-2.0.49. mod_perl 1.99 release12. Here is my mod_perl.conf which is included
                Message 7 of 27 , May 2, 2005
                • 0 Attachment
                  Perrin Harkins wrote:

                  >On Tue, 2005-05-03 at 00:21 +0800, jiesheng zhang wrote:
                  >
                  >
                  >>I saw debug information in the apache log file after I added the
                  >>
                  >>use Apache::DBI to the startup.pl. However, this is not mentioned in the Apache::DBI documentation. The documentation only mentioned that I should add
                  >>PerlModule Apache::DBI to the http.conf.
                  >>
                  >>
                  >
                  >Either way works. If you were doing it with PerlModule before, you
                  >should have seen the debug information.
                  >
                  >
                  The PerlModule seemed not working in my system. My system is suse 9.1,
                  apache-2.0.49. mod_perl 1.99 release12.
                  Here is my mod_perl.conf which is included to httpd.conf

                  <IfModule mod_perl.c>
                  PerlModule Apache::DBI
                  # PerlTrace all
                  PerlRequire "/etc/apache2/mod_perl-startup.pl"
                  # PerlOptions +OpenLogs +Log
                  ScriptAlias /perl/ "/srv/www/cgi-bin/"
                  <Location /perl/>
                  # mod_perl mode
                  SetHandler perl-script
                  PerlResponseHandler ModPerl::Registry
                  PerlOptions +ParseHeaders
                  Options +ExecCGI
                  </Location>

                  ScriptAlias /cgi-perl/ "/srv/www/cgi-bin/"
                  <Location /cgi-perl>
                  # perl cgi mode
                  SetHandler perl-script
                  PerlResponseHandler ModPerl::PerlRun
                  PerlOptions +ParseHeaders
                  Options +ExecCGI
                  </Location>

                  # The /cgi-bin/ ScriptAlias is already set up in httpd.conf

                  </IfModule>

                  By this configuration, without the "use Apache::DBI ();" and with
                  "$Apache::DBI::DEBUG=1" in the startup.pl, I could not see the debug
                  output in the error log.

                  >- Perrin
                  >
                  >
                • Michael Peters
                  ... looks like you hit it on the head. If you don t have $Apache::DBI::DEBUG=1 in your startup, then you wont see anything in the errorlog. from the doc: To
                  Message 8 of 27 , May 2, 2005
                  • 0 Attachment
                    jiesheng zhang wrote:

                    > By this configuration, without the "use Apache::DBI ();" and with
                    > "$Apache::DBI::DEBUG=1" in the startup.pl, I could not see the debug
                    > output in the error log.

                    looks like you hit it on the head. If you don't have
                    $Apache::DBI::DEBUG=1 in your startup, then you wont see anything in the
                    errorlog.

                    from the doc:
                    "To enable debugging the variable $Apache::DBI::DEBUG must be set. This
                    can either be done in startup.pl or in the user script."

                    --
                    Michael Peters
                    Developer
                    Plus Three, LP
                  • allan juul
                    ... (i don t have that method available in my mod_perl2) but about collecting data in a buffer variable. it seems i can actually $f- print that buffer, but not
                    Message 9 of 27 , May 3, 2005
                    • 0 Attachment
                      Stas Bekman wrote:
                      > allan juul wrote:
                      >
                      >> hi stas
                      >>
                      >> Stas Bekman wrote:
                      >>
                      >>> allan juul wrote:
                      >>> [...]
                      >>
                      >>
                      >>
                      >>>>> But if you use a mod_perl filter you will still hit the issue of
                      >>>>> unknown content-length header.
                      >>>>
                      >>>>
                      >>>>
                      >>>>
                      >>>>
                      >>>> yes, of course that's true.
                      >>>> there goes caching (:
                      >>>
                      >>>
                      >>>
                      >>>
                      >>> Not really. Nothing prevents you from buffering up the response,
                      >>> process it, set the content-length header and make the document
                      >>> cache-able.
                      >>
                      >>
                      >>
                      >> ok, eh how do i that. you mean instead of printing to STDOUT, collect
                      >> data in a buffer, then set the calculated Content-Length, then print
                      >> data?
                      >
                      >
                      > That's right.
                      >
                      >> anyway, it's pretty strange. it seems i'm able to set the
                      >> Content-Length when i use the mod_perl_filter and do *not* reverse
                      >> proxy. see both headers below. the strange things is that i'm not
                      >> allowed at all to set the standard Content-Length, but indeed allowed
                      >> to set a custom one called Content-Length2. and even stranger is that
                      >> this custom header presents a correct value when *not* proxying but
                      >> "0" when proxying. i use the exact same mod_perl code, also supplied
                      >> below. the actual filtering of data content works in both cases.
                      >
                      >
                      > Use must use $r->set_content_length(). See the mp2 test suite for examples.

                      (i don't have that method available in my mod_perl2)


                      but about collecting data in a buffer variable. it seems i can actually
                      $f->print that buffer, but not actually calculate the length of it. or
                      rather: i can calculate the length but when i set any header the value
                      is 0 (whether i set it before the $f->print statement or after).
                      it seems i must admit that i don't quite get what is going on and when.

                      can anyone supply a simple example i then can check on our reverse proxy ?

                      thanks
                      ./allan
                    • Jeff Ambrosino
                      I ve had some similar issues, but gotten around them by using erro_headers_out. This worked for me, so you might give it a try:
                      Message 10 of 27 , May 3, 2005
                      • 0 Attachment
                        I've had some similar issues, but gotten around them by using
                        erro_headers_out. This worked for me, so you might give it a try:

                        $f->r->headers_out->unset('Content-Length');
                        $f->r->err_headers_out->set('Content-Length' => length($NewBody));

                        Obviously "$NewBody" is whatever you're using to buffer the content.
                        FYI this is used with an HTTP output filter on mp2 (RC4) within a
                        reverse mod_proxy.

                        Jeff


                        On 5/3/05, allan juul <allan@...> wrote:
                        > but about collecting data in a buffer variable. it seems i can actually
                        > $f->print that buffer, but not actually calculate the length of it. or
                        > rather: i can calculate the length but when i set any header the value
                        > is 0 (whether i set it before the $f->print statement or after).
                        > it seems i must admit that i don't quite get what is going on and when.
                        >
                        > can anyone supply a simple example i then can check on our reverse proxy ?
                      • Stas Bekman
                        allan juul wrote: [...] ... You sure do :) % lookup set_content_length To use method set_content_length add: use Apache2::Response ();
                        Message 11 of 27 , May 3, 2005
                        • 0 Attachment
                          allan juul wrote:
                          [...]
                          >> Use must use $r->set_content_length(). See the mp2 test suite for
                          >> examples.
                          >
                          >
                          > (i don't have that method available in my mod_perl2)

                          You sure do :)

                          % lookup set_content_length
                          To use method 'set_content_length' add:
                          use Apache2::Response ();
                          http://perl.apache.org/docs/2.0/api/Apache2/Response.html#C_set_content_length_

                          > but about collecting data in a buffer variable. it seems i can actually
                          > $f->print that buffer, but not actually calculate the length of it. or
                          > rather: i can calculate the length but when i set any header the value
                          > is 0 (whether i set it before the $f->print statement or after).
                          > it seems i must admit that i don't quite get what is going on and when.
                          >
                          > can anyone supply a simple example i then can check on our reverse proxy ?

                          Try: t/response/TestApache/content_length_header.pm
                          Though I haven't tried to call it from the filter, so may be Jeff's
                          suggestion will work.

                          --
                          __________________________________________________________________
                          Stas Bekman JAm_pH ------> Just Another mod_perl Hacker
                          http://stason.org/ mod_perl Guide ---> http://perl.apache.org
                          mailto:stas@... http://use.perl.org http://apacheweek.com
                          http://modperlbook.org http://apache.org http://ticketmaster.com
                        • allan@muly.dk
                          ... ok maybe i have a screwed installiation or a missing use/namespace . method not found message in my error.log. ... Jeff s suggestion does indeed work.
                          Message 12 of 27 , May 4, 2005
                          • 0 Attachment
                            Quoting Stas Bekman <stas@...>:

                            > allan juul wrote:
                            > [...]
                            >>> Use must use $r->set_content_length(). See the mp2 test suite for examples.
                            >>
                            >>
                            >> (i don't have that method available in my mod_perl2)
                            >
                            > You sure do :)
                            >
                            > % lookup set_content_length
                            > To use method 'set_content_length' add:
                            > use Apache2::Response ();
                            > http://perl.apache.org/docs/2.0/api/Apache2/Response.html#C_set_content_length_

                            ok maybe i have a screwed installiation or a missing use/namespace .
                            "method not found" message in my error.log.

                            >> but about collecting data in a buffer variable. it seems i can
                            >> actually $f->print that buffer, but not actually calculate the
                            >> length of it. or rather: i can calculate the length but when i set
                            >> any header the value is 0 (whether i set it before the $f->print
                            >> statement or after).
                            >> it seems i must admit that i don't quite get what is going on and when.
                            >>
                            >> can anyone supply a simple example i then can check on our reverse proxy ?
                            >
                            > Try: t/response/TestApache/content_length_header.pm
                            > Though I haven't tried to call it from the filter, so may be Jeff's
                            > suggestion will work.


                            Jeff's suggestion does indeed work. oddly enough ;


                            ./a
                          • allan@muly.dk
                            hi i don t get it. the below filter does output the content alright it seems, but the setting of the header *value* is incorrect. (?) so the $f- print
                            Message 13 of 27 , May 4, 2005
                            • 0 Attachment
                              hi i don't get it. the below filter does output the content alright it
                              seems, but the setting of the header *value* is incorrect. (?)
                              so the $f->print statement prints correct output
                              but the calcualtion length(output) is incorrect (since it evaluates
                              length of this exact string "<html><head></head><body></body></html>\n"
                              )
                              why is that and how to fix this ??

                              many thanks
                              ./allan

                              # Apache/2.0.54 (Win32) mod_ssl/2.0.53 OpenSSL/0.9.7f proxy_html/2.4
                              mod_perl/1.999.22-dev Perl/v5.8.6 configured

                              # this is the actual 11 bytes of content on URL:
                              # hello world

                              # $ get localhost
                              # hello world


                              # $ head localhost
                              # ...
                              # Server: Microsoft-IIS/6.0
                              # Content-Length: 40
                              # Content-Type: text/html; charset=utf-8
                              # ...


                              # excerpt of code
                              my $context;
                              unless ($f->ctx) {
                              $r->headers_out->unset( "Content-Length" );
                              }

                              $context ||= $f->ctx;
                              my $content_length = 0;
                              my $str = "";

                              while ($f->read(my $buffer, 1024)) {
                              $buffer = $context->{extra} . $buffer if $context->{extra};
                              if (($context->{extra}) = $buffer =~ m/(<[^>]*)$/) {
                              $buffer = substr($buffer, 0, - length($context->{extra}));
                              }
                              $str .= $buffer;
                              }

                              if ($f->seen_eos) {
                              if ( $context->{extra} ) {
                              $str .= $context->{extra};
                              }
                              }

                              else {
                              $f->ctx($context);
                              }



                              $str = Rewrite::replace_links ( $str );
                              # at this point $str equals: <html><head></head><body></body></html>

                              $content_length += length( $str );

                              # set header
                              $r->err_headers_out->set('Content-Length', $content_length );

                              $f->print( $str );
                              # at this point $str equals: all 42KB of correct html
                            • Stas Bekman
                              ... It just happens to work in certain conditions. The correct solution is to use a bucket brigade-based filter, which gives you a complete control. What s
                              Message 14 of 27 , May 9, 2005
                              • 0 Attachment
                                allan@... wrote:
                                > Quoting Stas Bekman <stas@...>:
                                >
                                >> allan juul wrote:
                                >> [...]
                                >>
                                >>>> Use must use $r->set_content_length(). See the mp2 test suite for
                                >>>> examples.
                                >>>
                                >>>
                                >>>
                                >>> (i don't have that method available in my mod_perl2)
                                >>
                                >>
                                >> You sure do :)
                                >>
                                >> % lookup set_content_length
                                >> To use method 'set_content_length' add:
                                >> use Apache2::Response ();
                                >> http://perl.apache.org/docs/2.0/api/Apache2/Response.html#C_set_content_length_
                                >>
                                >
                                >
                                > ok maybe i have a screwed installiation or a missing use/namespace .
                                > "method not found" message in my error.log.
                                >
                                >>> but about collecting data in a buffer variable. it seems i can
                                >>> actually $f->print that buffer, but not actually calculate the length
                                >>> of it. or rather: i can calculate the length but when i set any
                                >>> header the value is 0 (whether i set it before the $f->print
                                >>> statement or after).
                                >>> it seems i must admit that i don't quite get what is going on and when.
                                >>>
                                >>> can anyone supply a simple example i then can check on our reverse
                                >>> proxy ?
                                >>
                                >>
                                >> Try: t/response/TestApache/content_length_header.pm
                                >> Though I haven't tried to call it from the filter, so may be Jeff's
                                >> suggestion will work.
                                >
                                >
                                >
                                > Jeff's suggestion does indeed work. oddly enough ;

                                It just happens to work in certain conditions. The correct solution is to
                                use a bucket brigade-based filter, which gives you a complete control.
                                What's happening is that streaming filter API passes FLUSH buckets
                                through, and you can't control that. We have to do that to conform to the
                                FLUSH requests, to be a well-behaved filter by default.
                                I've revealed that using 2 debug filters plugged before and after the
                                filter in question. This is a very useful debugging tool:
                                http://search.cpan.org/dist/Apache-DebugFilter/

                                So the following solution works just fine, it'll be added shortly to the
                                mp2 test suite as a pair of tests: t/filter/out_str_buffer.t
                                t/filter/TestFilter/out_str_buffer.pm

                                and I'll document it too.

                                sub flatten_bb {
                                my ($bb) = shift;

                                my $seen_eos = 0;

                                my @data;
                                for (my $b = $bb->first; $b; $b = $bb->next($b)) {
                                $seen_eos++, last if $b->is_eos;
                                $b->read(my $bdata);
                                push @data, $bdata;
                                }
                                return (join('', @data), $seen_eos);
                                }

                                sub handler {
                                my($filter, $bb) = @_;

                                my $ctx = $filter->ctx;

                                # no need to unset the C-L header, since this filter makes sure to
                                # correct it before any headers go out.
                                #unless ($ctx) {
                                # $filter->r->headers_out->unset('Content-Length');
                                #}

                                my $data = exists $ctx->{data} ? $ctx->{data} : '';
                                $ctx->{invoked}++;
                                my($bdata, $seen_eos) = flatten_bb($bb);
                                $bdata =~ s/-//g;
                                $data .= $bdata if $bdata;

                                if ($seen_eos) {
                                my $len = length $data;
                                $filter->r->headers_out->set('Content-Length', $len);
                                $filter->print($data) if $data;
                                }
                                else {
                                # store context for all but the last invocation
                                $ctx->{data} = $data;
                                $filter->ctx($ctx);
                                }

                                return Apache2::Const::OK;
                                }


                                --
                                __________________________________________________________________
                                Stas Bekman JAm_pH ------> Just Another mod_perl Hacker
                                http://stason.org/ mod_perl Guide ---> http://perl.apache.org
                                mailto:stas@... http://use.perl.org http://apacheweek.com
                                http://modperlbook.org http://apache.org http://ticketmaster.com
                              • Stas Bekman
                                ... Allan, I suggest that you spend time reading this document: http://perl.apache.org/docs/2.0/user/handlers/filters.html Clearly you don t realize that
                                Message 15 of 27 , May 9, 2005
                                • 0 Attachment
                                  allan@... wrote:
                                  > hi i don't get it. the below filter does output the content alright it
                                  > seems, but the setting of the header *value* is incorrect. (?)
                                  > so the $f->print statement prints correct output
                                  > but the calcualtion length(output) is incorrect (since it evaluates
                                  > length of this exact string "<html><head></head><body></body></html>\n" )
                                  > why is that and how to fix this ??

                                  Allan, I suggest that you spend time reading this document:
                                  http://perl.apache.org/docs/2.0/user/handlers/filters.html

                                  Clearly you don't realize that filters are invoked multiple times.

                                  See my other reply for an example of a working code. If after reading the
                                  doc you have questions, I'd be glad to answer those.

                                  In particular notice that as soon as something is sent from the request
                                  handler out, apache will generate its HTTP response headers and you can't
                                  change those afterwards, since they were already sent to the client.

                                  --
                                  __________________________________________________________________
                                  Stas Bekman JAm_pH ------> Just Another mod_perl Hacker
                                  http://stason.org/ mod_perl Guide ---> http://perl.apache.org
                                  mailto:stas@... http://use.perl.org http://apacheweek.com
                                  http://modperlbook.org http://apache.org http://ticketmaster.com
                                • allan@muly.dk
                                  ... well its not available yet on win32. ... thanks for the example andf replies. however, i get this error: Can t locate object method first via package
                                  Message 16 of 27 , May 10, 2005
                                  • 0 Attachment
                                    Quoting Stas Bekman <stas@...>:

                                    > allan@... wrote:
                                    >> Quoting Stas Bekman <stas@...>:
                                    >>
                                    >>> allan juul wrote:
                                    >>> [...]
                                    >>>
                                    >>>>> Use must use $r->set_content_length(). See the mp2 test suite for
                                    >>>>> examples.
                                    >>>>
                                    >>>>
                                    >>>>
                                    >>>> (i don't have that method available in my mod_perl2)
                                    >>>
                                    >>>
                                    >>> You sure do :)
                                    >>>
                                    >>> % lookup set_content_length
                                    >>> To use method 'set_content_length' add:
                                    >>> use Apache2::Response ();
                                    >>> http://perl.apache.org/docs/2.0/api/Apache2/Response.html#C_set_content_length_
                                    >>
                                    >>
                                    >> ok maybe i have a screwed installiation or a missing use/namespace .
                                    >> "method not found" message in my error.log.
                                    >>
                                    >>>> but about collecting data in a buffer variable. it seems i can
                                    >>>> actually $f->print that buffer, but not actually calculate the
                                    >>>> length of it. or rather: i can calculate the length but when i set
                                    >>>> any header the value is 0 (whether i set it before the $f->print
                                    >>>> statement or after).
                                    >>>> it seems i must admit that i don't quite get what is going on and when.
                                    >>>>
                                    >>>> can anyone supply a simple example i then can check on our reverse proxy ?
                                    >>>
                                    >>>
                                    >>> Try: t/response/TestApache/content_length_header.pm
                                    >>> Though I haven't tried to call it from the filter, so may be Jeff's
                                    >>> suggestion will work.
                                    >>
                                    >>
                                    >>
                                    >> Jeff's suggestion does indeed work. oddly enough ;
                                    >
                                    > It just happens to work in certain conditions. The correct solution
                                    > is to use a bucket brigade-based filter, which gives you a complete
                                    > control. What's happening is that streaming filter API passes FLUSH
                                    > buckets through, and you can't control that. We have to do that to
                                    > conform to the FLUSH requests, to be a well-behaved filter by default.
                                    > I've revealed that using 2 debug filters plugged before and after the
                                    > filter in question. This is a very useful debugging tool:
                                    > http://search.cpan.org/dist/Apache-DebugFilter/

                                    well its not available yet on win32.

                                    > So the following solution works just fine, it'll be added shortly to
                                    > the mp2 test suite as a pair of tests: t/filter/out_str_buffer.t
                                    > t/filter/TestFilter/out_str_buffer.pm


                                    thanks for the example andf replies. however, i get this error:

                                    Can't locate object method "first" via package "APR::Brigade" i have
                                    prior to that just uninstalled mod_perl [RC5] and installed mod_perl
                                    [RC6] via ppm (randys repository i beleve)


                                    ./allan



                                    > and I'll document it too.
                                    >
                                    > sub flatten_bb {
                                    > my ($bb) = shift;
                                    >
                                    > my $seen_eos = 0;
                                    >
                                    > my @data;
                                    > for (my $b = $bb->first; $b; $b = $bb->next($b)) {
                                    > $seen_eos++, last if $b->is_eos;
                                    > $b->read(my $bdata);
                                    > push @data, $bdata;
                                    > }
                                    > return (join('', @data), $seen_eos);
                                    > }
                                    >
                                    > sub handler {
                                    > my($filter, $bb) = @_;
                                    >
                                    > my $ctx = $filter->ctx;
                                    >
                                    > # no need to unset the C-L header, since this filter makes sure to
                                    > # correct it before any headers go out.
                                    > #unless ($ctx) {
                                    > # $filter->r->headers_out->unset('Content-Length');
                                    > #}
                                    >
                                    > my $data = exists $ctx->{data} ? $ctx->{data} : '';
                                    > $ctx->{invoked}++;
                                    > my($bdata, $seen_eos) = flatten_bb($bb);
                                    > $bdata =~ s/-//g;
                                    > $data .= $bdata if $bdata;
                                    >
                                    > if ($seen_eos) {
                                    > my $len = length $data;
                                    > $filter->r->headers_out->set('Content-Length', $len);
                                    > $filter->print($data) if $data;
                                    > }
                                    > else {
                                    > # store context for all but the last invocation
                                    > $ctx->{data} = $data;
                                    > $filter->ctx($ctx);
                                    > }
                                    >
                                    > return Apache2::Const::OK;
                                    > }
                                    >
                                    >
                                    > --
                                    > __________________________________________________________________
                                    > Stas Bekman JAm_pH ------> Just Another mod_perl Hacker
                                    > http://stason.org/ mod_perl Guide ---> http://perl.apache.org
                                    > mailto:stas@... http://use.perl.org http://apacheweek.com
                                    > http://modperlbook.org http://apache.org http://ticketmaster.com
                                    >
                                  • Stas Bekman
                                    allan@muly.dk wrote: [...] ... what do you mean? It s a pure perl module. ... sorry, I didn t paste the part that loads the modules, please see:
                                    Message 17 of 27 , May 10, 2005
                                    • 0 Attachment
                                      allan@... wrote:
                                      [...]
                                      >>>>> can anyone supply a simple example i then can check on our reverse
                                      >>>>> proxy ?
                                      >>>>
                                      >>>>
                                      >>>>
                                      >>>> Try: t/response/TestApache/content_length_header.pm
                                      >>>> Though I haven't tried to call it from the filter, so may be Jeff's
                                      >>>> suggestion will work.
                                      >>>
                                      >>>
                                      >>>
                                      >>>
                                      >>> Jeff's suggestion does indeed work. oddly enough ;
                                      >>
                                      >>
                                      >> It just happens to work in certain conditions. The correct solution is
                                      >> to use a bucket brigade-based filter, which gives you a complete
                                      >> control. What's happening is that streaming filter API passes FLUSH
                                      >> buckets through, and you can't control that. We have to do that to
                                      >> conform to the FLUSH requests, to be a well-behaved filter by default.
                                      >> I've revealed that using 2 debug filters plugged before and after the
                                      >> filter in question. This is a very useful debugging tool:
                                      >> http://search.cpan.org/dist/Apache-DebugFilter/
                                      >
                                      >
                                      > well its not available yet on win32.

                                      what do you mean? It's a pure perl module.

                                      >> So the following solution works just fine, it'll be added shortly to
                                      >> the mp2 test suite as a pair of tests: t/filter/out_str_buffer.t
                                      >> t/filter/TestFilter/out_str_buffer.pm
                                      >
                                      >
                                      >
                                      > thanks for the example andf replies. however, i get this error:
                                      >
                                      > Can't locate object method "first" via package "APR::Brigade" i have
                                      > prior to that just uninstalled mod_perl [RC5] and installed mod_perl
                                      > [RC6] via ppm (randys repository i beleve)

                                      sorry, I didn't paste the part that loads the modules, please see:
                                      http://perl.apache.org/docs/2.0/user/handlers/filters.html#Setting_the_Content_Length_Header_in_Request_Output_Filters

                                      --
                                      __________________________________________________________________
                                      Stas Bekman JAm_pH ------> Just Another mod_perl Hacker
                                      http://stason.org/ mod_perl Guide ---> http://perl.apache.org
                                      mailto:stas@... http://use.perl.org http://apacheweek.com
                                      http://modperlbook.org http://apache.org http://ticketmaster.com
                                    Your message has been successfully submitted and would be delivered to recipients shortly.