[Catalyst] p-static-simple line-ending patch

Carl Franks fireartist at gmail.com
Fri Feb 24 18:01:11 CET 2006


I'm just mentioning up here that I've figured out the problem, in case
you get bored by the bottom of the mail ;)
How to fix it is another matter!


On 24/02/06, A. Pagaltzis <pagaltzis at gmx.de> wrote:

> But how large is the response body that wget receives? Does its
> size differ from the value of the Content-Length header, and if
> so, by how much?

Ok, I've run the following 3 commands.

Create 1.txt, saving the headers.
Content-length: 4,812
Data saved: 4,812


>wget -s -O 1.txt http://134.36.192.160/cdiary/groupevents/1
--15:22:28--  http://134.36.192.160/cdiary/groupevents/1
           => `1.txt'
Connecting to 134.36.192.160:80... connected.
HTTP request sent, awaiting response... 200
Length: 4,812 [text/html]

100%[====================================>] 4,812          4.59M/s    ETA 00:00

15:22:30 (4.59 MB/s) - `1.txt' saved [4812/4812]


Create 2.txt, saving the headers and ignoring content-length.
Content-length: ignored
Data saved: 4,832

Difference: 20 bytes
If you look at 1.txt and 2.txt, you can see that 1.txt is cut 20 bytes
short (each dos line break is 2 bytes)

\r\n
</body>\r\n
</html>\r\n


Create 3.txt, saving the headers and ignoring content-length.
Content-length: ignored
Data saved: 4,832

>wget --ignore-length -s -O 2.txt http://134.36.192.160/cdiary/groupevents/1
--15:22:38--  http://134.36.192.160/cdiary/groupevents/1
           => `2.txt'
Connecting to 134.36.192.160:80... connected.
HTTP request sent, awaiting response... 200
Length: ignored [text/html]

    [ <=>                                 ] 4,832          4.61M/s

15:22:57 (4.61 MB/s) - `2.txt' saved [4832]


For reference, 2.txt is when Catalyst.pm is edited to not send content-length.
Content-length: not sent
Data saved: 4,832


>wget -s -O 3.txt http://134.36.192.160/cdiary/groupevents/1
--15:28:57--  http://134.36.192.160/cdiary/groupevents/1
           => `3.txt'
Connecting to 134.36.192.160:80... connected.
HTTP request sent, awaiting response... 200
Length: unspecified [text/html]

    [ <=>                                 ] 4,832          4.61M/s

15:29:00 (4.61 MB/s) - `3.txt' saved [4832]


Ok, so catalyst is adding a content-length 20 bytes short of what is being sent.
It's just occured to me, how many lines does the body of the message contain?

20

So when catalyst does it's bytes::length(), it's correct at that point in time.
When the response comes out of apache though, it's increased by the
number of line-breaks.

I can confirm this by adding 3 line-breaks in the html template file.
If I retrieve the file with
`wget`
the content-length increases by 3 bytes, but if I retrieve the file using
`wget --ignore-header`
The data size increases by 6 bytes


I tried changing the line that sets the content-length to:

my $body = $c->response->body;
my $count = $body =~ s/\n//g;
$c->response->content_length( bytes::length( $c->response->body ) + $count );

It simply increases the content length by the number of "\n" found.
It certainly works for me - meaning - the correct content-length is sent.
But it shouldn't be necessary.

Up to now, this makes me think it's an apache issue, because this
problem doesn't happen at all running the script/server.pl

I tried setting "binmode STDOUT" - this also fixed the problem.

However I expect both of these hacks will interfere with my
"p-static-simple line-ending patch" suggestion - (another thread on
this list).

This means though that the problem is definitely, that after perl has
counted the bytes, the "\n" are being converted to "\r\n"
It can't just be a perl issue though, because it's only happening
under apache cgi.

btw, I'm not using ActivePerl, I'm using VanillaPerl 5.8.8
 - http://camelpack.sourceforge.net/index.php/VanillaPerl

Can anyone else replicate this using cat / apache / cgi / win ?

Cheers,
Carl
-------------- next part --------------
HTTP/1.1 200
Date: Fri, 24 Feb 2006 15:22:28 GMT
Server: Apache/2.0.55 (Win32) PHP/4.4.1
X-Catalyst: 5.64
Content-Length: 4812
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="/fig/default.css" rel="stylesheet" type="text/css">
<link href="http://134.36.192.160/cdiary/css/cdiary.css" rel="stylesheet" type="text/css">
</head>

<body>


<div id="mainContent">
	<div class="month"><table bgcolor="white" border=1 cellpadding=0 cellspacing=0><tr align="left" valign="top"><td align="left" colspan=5 valign="top">February</td><td align="left" colspan=2 valign="top">2006</td></tr><tr align="left" valign="top"><td align="left" valign="top">Mon</td><td align="left" valign="top">Tue</td><td align="left" valign="top">Wed</td><td align="left" valign="top">Thu</td><td align="left" valign="top">Fri</td><td align="left" valign="top">Sat</td><td align="left" valign="top">Sun</td></tr><tr align="left" valign="top"><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">1</td><td align="left" valign="top">2</td><td align="left" valign="top">3</td><td align="left" valign="top">4</td><td align="left" valign="top">5</td></tr><tr align="left" valign="top"><td align="left" valign="top">6</td><td align="left" valign="top">7</td><td align="left" valign="top">8</td><td align="left" valign="top">9</td><td align="left" valign="top">10</td><td align="left" valign="top">11</td><td align="left" valign="top">12</td></tr><tr align="left" valign="top"><td align="left" valign="top">13</td><td align="left" valign="top">14</td><td align="left" valign="top">15</td><td align="left" valign="top">16</td><td align="left" valign="top">17</td><td align="left" valign="top">18</td><td align="left" valign="top">19</td></tr><tr align="left" valign="top"><td align="left" valign="top">20</td><td align="left" valign="top">21<span title="" class="monthEvent"> 7.30pm<br>mixed<a href="http://134.36.192.160/cdiary/edit/event/1">(edit)</a></span></td><td align="left" valign="top">22</td><td align="left" valign="top">23</td><td align="left" class="monthToday" valign="top">24</td><td align="left" valign="top">25</td><td align="left" valign="top">26</td></tr><tr align="left" valign="top"><td align="left" valign="top">27</td><td align="left" valign="top">28<span title="At Adrian&#39;s" class="monthEvent"> 7.30pm<br>men<a href="http://134.36.192.160/cdiary/edit/event/3">(edit)</a></span></td><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">&nbsp; </td></tr></table>
</div>
	<div class="month"><table bgcolor="white" border=1 cellpadding=0 cellspacing=0><tr align="left" valign="top"><td align="left" colspan=5 valign="top">March</td><td align="left" colspan=2 valign="top">2006</td></tr><tr align="left" valign="top"><td align="left" valign="top">Mon</td><td align="left" valign="top">Tue</td><td align="left" valign="top">Wed</td><td align="left" valign="top">Thu</td><td align="left" valign="top">Fri</td><td align="left" valign="top">Sat</td><td align="left" valign="top">Sun</td></tr><tr align="left" valign="top"><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">1</td><td align="left" valign="top">2</td><td align="left" valign="top">3</td><td align="left" valign="top">4</td><td align="left" valign="top">5</td></tr><tr align="left" valign="top"><td align="left" valign="top">6</td><td align="left" valign="top">7<span title="" class="monthEvent"> 7.30pm<br>mixed<a href="http://134.36.192.160/cdiary/edit/event/4">(edit)</a></span></td><td align="left" valign="top">8</td><td align="left" valign="top">9</td><td align="left" valign="top">10</td><td align="left" valign="top">11</td><td align="left" valign="top">12</td></tr><tr align="left" valign="top"><td align="left" valign="top">13</td><td align="left" valign="top">14</td><td align="left" valign="top">15</td><td align="left" valign="top">16</td><td align="left" valign="top">17</td><td align="left" valign="top">18</td><td align="left" valign="top">19</td></tr><tr align="left" valign="top"><td align="left" valign="top">20</td><td align="left" valign="top">21</td><td align="left" valign="top">22</td><td align="left" valign="top">23</td><td align="left" valign="top">24</td><td align="left" valign="top">25</td><td align="left" valign="top">26</td></tr><tr align="left" valign="top"><td align="left" valign="top">27</td><td align="left" valign="top">28</td><td align="left" valign="top">29</td><td align="left" valign="top">30</td><td align="left" valign="top">31</td><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">&nbsp; </td></tr></table>
</div>
</div>

















































-------------- next part --------------
HTTP/1.1 200
Date: Fri, 24 Feb 2006 15:22:38 GMT
Server: Apache/2.0.55 (Win32) PHP/4.4.1
X-Catalyst: 5.64
Content-Length: 4812
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="/fig/default.css" rel="stylesheet" type="text/css">
<link href="http://134.36.192.160/cdiary/css/cdiary.css" rel="stylesheet" type="text/css">
</head>

<body>


<div id="mainContent">
	<div class="month"><table bgcolor="white" border=1 cellpadding=0 cellspacing=0><tr align="left" valign="top"><td align="left" colspan=5 valign="top">February</td><td align="left" colspan=2 valign="top">2006</td></tr><tr align="left" valign="top"><td align="left" valign="top">Mon</td><td align="left" valign="top">Tue</td><td align="left" valign="top">Wed</td><td align="left" valign="top">Thu</td><td align="left" valign="top">Fri</td><td align="left" valign="top">Sat</td><td align="left" valign="top">Sun</td></tr><tr align="left" valign="top"><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">1</td><td align="left" valign="top">2</td><td align="left" valign="top">3</td><td align="left" valign="top">4</td><td align="left" valign="top">5</td></tr><tr align="left" valign="top"><td align="left" valign="top">6</td><td align="left" valign="top">7</td><td align="left" valign="top">8</td><td align="left" valign="top">9</td><td align="left" valign="top">10</td><td align="left" valign="top">11</td><td align="left" valign="top">12</td></tr><tr align="left" valign="top"><td align="left" valign="top">13</td><td align="left" valign="top">14</td><td align="left" valign="top">15</td><td align="left" valign="top">16</td><td align="left" valign="top">17</td><td align="left" valign="top">18</td><td align="left" valign="top">19</td></tr><tr align="left" valign="top"><td align="left" valign="top">20</td><td align="left" valign="top">21<span title="" class="monthEvent"> 7.30pm<br>mixed<a href="http://134.36.192.160/cdiary/edit/event/1">(edit)</a></span></td><td align="left" valign="top">22</td><td align="left" valign="top">23</td><td align="left" class="monthToday" valign="top">24</td><td align="left" valign="top">25</td><td align="left" valign="top">26</td></tr><tr align="left" valign="top"><td align="left" valign="top">27</td><td align="left" valign="top">28<span title="At Adrian&#39;s" class="monthEvent"> 7.30pm<br>men<a href="http://134.36.192.160/cdiary/edit/event/3">(edit)</a></span></td><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">&nbsp; </td></tr></table>
</div>
	<div class="month"><table bgcolor="white" border=1 cellpadding=0 cellspacing=0><tr align="left" valign="top"><td align="left" colspan=5 valign="top">March</td><td align="left" colspan=2 valign="top">2006</td></tr><tr align="left" valign="top"><td align="left" valign="top">Mon</td><td align="left" valign="top">Tue</td><td align="left" valign="top">Wed</td><td align="left" valign="top">Thu</td><td align="left" valign="top">Fri</td><td align="left" valign="top">Sat</td><td align="left" valign="top">Sun</td></tr><tr align="left" valign="top"><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">1</td><td align="left" valign="top">2</td><td align="left" valign="top">3</td><td align="left" valign="top">4</td><td align="left" valign="top">5</td></tr><tr align="left" valign="top"><td align="left" valign="top">6</td><td align="left" valign="top">7<span title="" class="monthEvent"> 7.30pm<br>mixed<a href="http://134.36.192.160/cdiary/edit/event/4">(edit)</a></span></td><td align="left" valign="top">8</td><td align="left" valign="top">9</td><td align="left" valign="top">10</td><td align="left" valign="top">11</td><td align="left" valign="top">12</td></tr><tr align="left" valign="top"><td align="left" valign="top">13</td><td align="left" valign="top">14</td><td align="left" valign="top">15</td><td align="left" valign="top">16</td><td align="left" valign="top">17</td><td align="left" valign="top">18</td><td align="left" valign="top">19</td></tr><tr align="left" valign="top"><td align="left" valign="top">20</td><td align="left" valign="top">21</td><td align="left" valign="top">22</td><td align="left" valign="top">23</td><td align="left" valign="top">24</td><td align="left" valign="top">25</td><td align="left" valign="top">26</td></tr><tr align="left" valign="top"><td align="left" valign="top">27</td><td align="left" valign="top">28</td><td align="left" valign="top">29</td><td align="left" valign="top">30</td><td align="left" valign="top">31</td><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">&nbsp; </td></tr></table>
</div>
</div>
</body>
</html>


















































-------------- next part --------------
HTTP/1.1 200
Date: Fri, 24 Feb 2006 15:28:57 GMT
Server: Apache/2.0.55 (Win32) PHP/4.4.1
X-Catalyst: 5.64
Connection: close
Content-Type: text/html; charset=utf-8

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="/fig/default.css" rel="stylesheet" type="text/css">
<link href="http://134.36.192.160/cdiary/css/cdiary.css" rel="stylesheet" type="text/css">
</head>

<body>


<div id="mainContent">
	<div class="month"><table bgcolor="white" border=1 cellpadding=0 cellspacing=0><tr align="left" valign="top"><td align="left" colspan=5 valign="top">February</td><td align="left" colspan=2 valign="top">2006</td></tr><tr align="left" valign="top"><td align="left" valign="top">Mon</td><td align="left" valign="top">Tue</td><td align="left" valign="top">Wed</td><td align="left" valign="top">Thu</td><td align="left" valign="top">Fri</td><td align="left" valign="top">Sat</td><td align="left" valign="top">Sun</td></tr><tr align="left" valign="top"><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">1</td><td align="left" valign="top">2</td><td align="left" valign="top">3</td><td align="left" valign="top">4</td><td align="left" valign="top">5</td></tr><tr align="left" valign="top"><td align="left" valign="top">6</td><td align="left" valign="top">7</td><td align="left" valign="top">8</td><td align="left" valign="top">9</td><td align="left" valign="top">10</td><td align="left" valign="top">11</td><td align="left" valign="top">12</td></tr><tr align="left" valign="top"><td align="left" valign="top">13</td><td align="left" valign="top">14</td><td align="left" valign="top">15</td><td align="left" valign="top">16</td><td align="left" valign="top">17</td><td align="left" valign="top">18</td><td align="left" valign="top">19</td></tr><tr align="left" valign="top"><td align="left" valign="top">20</td><td align="left" valign="top">21<span title="" class="monthEvent"> 7.30pm<br>mixed<a href="http://134.36.192.160/cdiary/edit/event/1">(edit)</a></span></td><td align="left" valign="top">22</td><td align="left" valign="top">23</td><td align="left" class="monthToday" valign="top">24</td><td align="left" valign="top">25</td><td align="left" valign="top">26</td></tr><tr align="left" valign="top"><td align="left" valign="top">27</td><td align="left" valign="top">28<span title="At Adrian&#39;s" class="monthEvent"> 7.30pm<br>men<a href="http://134.36.192.160/cdiary/edit/event/3">(edit)</a></span></td><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">&nbsp; </td></tr></table>
</div>
	<div class="month"><table bgcolor="white" border=1 cellpadding=0 cellspacing=0><tr align="left" valign="top"><td align="left" colspan=5 valign="top">March</td><td align="left" colspan=2 valign="top">2006</td></tr><tr align="left" valign="top"><td align="left" valign="top">Mon</td><td align="left" valign="top">Tue</td><td align="left" valign="top">Wed</td><td align="left" valign="top">Thu</td><td align="left" valign="top">Fri</td><td align="left" valign="top">Sat</td><td align="left" valign="top">Sun</td></tr><tr align="left" valign="top"><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">1</td><td align="left" valign="top">2</td><td align="left" valign="top">3</td><td align="left" valign="top">4</td><td align="left" valign="top">5</td></tr><tr align="left" valign="top"><td align="left" valign="top">6</td><td align="left" valign="top">7<span title="" class="monthEvent"> 7.30pm<br>mixed<a href="http://134.36.192.160/cdiary/edit/event/4">(edit)</a></span></td><td align="left" valign="top">8</td><td align="left" valign="top">9</td><td align="left" valign="top">10</td><td align="left" valign="top">11</td><td align="left" valign="top">12</td></tr><tr align="left" valign="top"><td align="left" valign="top">13</td><td align="left" valign="top">14</td><td align="left" valign="top">15</td><td align="left" valign="top">16</td><td align="left" valign="top">17</td><td align="left" valign="top">18</td><td align="left" valign="top">19</td></tr><tr align="left" valign="top"><td align="left" valign="top">20</td><td align="left" valign="top">21</td><td align="left" valign="top">22</td><td align="left" valign="top">23</td><td align="left" valign="top">24</td><td align="left" valign="top">25</td><td align="left" valign="top">26</td></tr><tr align="left" valign="top"><td align="left" valign="top">27</td><td align="left" valign="top">28</td><td align="left" valign="top">29</td><td align="left" valign="top">30</td><td align="left" valign="top">31</td><td align="left" valign="top">&nbsp; </td><td align="left" valign="top">&nbsp; </td></tr></table>
</div>
</div>
</body>
</html>




















































More information about the Catalyst mailing list