Hello Andy,

the problem is that SSL need to write back to the client if it reads something from the client or it has to write to the server if it reads something from the server. Currently there is no way in POE to do this in a Filter, the filter can only transform data it reads but is not able to write in the direction the data has been come from. POE::Filter::SSL in version 0.19 (still available on CPAN) don't overwrite but instead needs a line on the Input-Handler to be able to do the write-back. The Perl Module Data::Transform is a module from an other person which resolves the same problem in an other way than overwriting the problematic code on runtime. His request to support this write-back on reading didn't get any answer, so he realised this own module part. My mail on the mailing list about this issue didn't get any answer, too, so I made this overwriting.

Please tell me how to reproduce your problem. If I can reproduce I will try to fix this.

Regards,
Markus Müller
Begin forwarded message:

From: Andy Jenkinson<andy.jenkin...@gmail.com>
Date: 8 March 2012 17:04:29 GMT
To: pr...@cpan.org
Subject: poe-filter-ssl bug

Hi,

I have been having some problems adding POE::Filter::SSL into my application, which is a 
custom HTTP server using POE::ReadWrite and POE::Filtter::HTTPD. I have found when 
testing my application in Chrome that the filter would return a partially parsed request 
once the SSL negotiation has succeeded, bypassing the HTTPD filter. The HTTPD filter 
would thus be missing the beginning of the request to parse. It seems the same thing 
happens when using the examples in the POD itself. To cut a long story short, I have 
tracked the bug down to the overwriting of the Stackable get_one method. I must admit 
that I don't fully understand what this is doing or why the module chooses to overload 
Stackable's normal operation, but it looks like the problem is that the 
"doSendback" check takes no account of if there is data to be exchanged with 
the next filter, i.e. if $return is an array with multiple elements. I fixed it in my 
application by changing the check in the overridden get_one to:

if (checkForDoSendback($return)&&  ($return->[0] eq $filter)) {
  return $return if (scalar @$return == 1);
  shift @$return;;
}

I have to ask: why does the filter need to go through this hacking of the 
symbol table?

Cheers,
Andy


Reply via email to