rack-devel archive mirror (unofficial) https://groups.google.com/group/rack-devel
 help / color / mirror / Atom feed
* CommonLogger (and Clogger) generates strange symbols in the response body
@ 2009-09-03 23:02 Iñaki Baz Castillo
  2009-09-03 23:28 ` Iñaki Baz Castillo
  2009-09-04  1:35 ` Eric Wong
  0 siblings, 2 replies; 8+ messages in thread
From: Iñaki Baz Castillo @ 2009-09-03 23:02 UTC (permalink / raw)
  To: rack-devel


Hi, I can't understand why the following issue occurs in the response body 
when using CommonLogger:


----- app_logic.rb -----
class AppLogic
  def call(env)
    200, {"Content-Type" => "text/plain"}, "line1\nline2\nline3\n"
  end
end
------------------------


------- run_server.rb ------
require "app_logic.rb"
rack_inner_app = AppLogic.new

rack_app = Rack::Builder.new {
  use Rack::CommonLogger, $stderr
  run rack_inner_app
}.to_app

Rack::Handler::Thin.run rack_app
----------------------------



The reply I get in the 200 OK response is as follows:

-------------
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: text/plain
Server: OpenXDMS
Connection: close

6
line1

6
line2

6
line3

0

-------------

As you can see, the number above each real body line is the length of the line 
below it (in hexadecimal when > 10).


If I comment the CommonLogger line, then I get the correct body:

--------------
line1
line2
line3
--------------



It occurs the same if I log to a file and also if I use Clogger instead of 
CommonLogger.

Is there something wrong in my code? is it the expected behaviour? (I cannot 
figure it of course as it breaks the response).


Thanks a lot.



-- 
Iñaki Baz Castillo <ibc@aliax.net>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: CommonLogger (and Clogger) generates strange symbols in the response body
  2009-09-03 23:02 CommonLogger (and Clogger) generates strange symbols in the response body Iñaki Baz Castillo
@ 2009-09-03 23:28 ` Iñaki Baz Castillo
  2009-09-04  1:35 ` Eric Wong
  1 sibling, 0 replies; 8+ messages in thread
From: Iñaki Baz Castillo @ 2009-09-03 23:28 UTC (permalink / raw)
  To: rack-devel


El Viernes, 4 de Septiembre de 2009, Iñaki Baz Castillo escribió:
> Hi, I can't understand why the following issue occurs in the response body
> when using CommonLogger:
> 
> 
> ----- app_logic.rb -----
> class AppLogic
>   def call(env)
>     200, {"Content-Type" => "text/plain"}, "line1\nline2\nline3\n"
>   end
> end
> ------------------------
> 
> 
> ------- run_server.rb ------
> require "app_logic.rb"
> rack_inner_app = AppLogic.new
> 
> rack_app = Rack::Builder.new {
>   use Rack::CommonLogger, $stderr
>   run rack_inner_app
> }.to_app
> 
> Rack::Handler::Thin.run rack_app
> ----------------------------
> 
> 
> 
> The reply I get in the 200 OK response is as follows:
> 
> -------------
> HTTP/1.1 200 OK
> Transfer-Encoding: chunked
> Content-Type: text/plain
> Server: OpenXDMS
> Connection: close
> 
> 6
> line1
> 
> 6
> line2
> 
> 6
> line3
> 
> 0
> 
> -------------
> 
> As you can see, the number above each real body line is the length of the
>  line below it (in hexadecimal when > 10).
> 
> 
> If I comment the CommonLogger line, then I get the correct body:
> 
> --------------
> line1
> line2
> line3
> --------------
> 
> 
> 
> It occurs the same if I log to a file and also if I use Clogger instead of
> CommonLogger.
> 
> Is there something wrong in my code? is it the expected behaviour? (I
>  cannot figure it of course as it breaks the response).

It's not an error in my code as a simpler example also issues this problem:

-----simple_rack.rb--------
require 'rubygems'
require 'rack'

infinity = Proc.new {|env| [200, {"Content-Type" => "text/html"}, "hello"]}
builder = Rack::Builder.new do
  use Rack::CommonLogger
  run infinity
end
Rack::Handler::Mongrel.run builder, :Port => 9292
---------------------------

~# ruby1.8 simple_rack.rb


And this is the response:

---------------------------
HTTP/1.1 200 OK
Connection: close
Date: Thu, 03 Sep 2009 23:24:39 GMT
Transfer-Encoding: chunked
Content-Type: text/html

4
hello
0

---------------------------


Without the CommonLogger middleware, the response body is correct:

----------
hello
----------



¿?¿?

-- 
Iñaki Baz Castillo <ibc@aliax.net>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: CommonLogger (and Clogger) generates strange symbols in the response body
  2009-09-03 23:02 CommonLogger (and Clogger) generates strange symbols in the response body Iñaki Baz Castillo
  2009-09-03 23:28 ` Iñaki Baz Castillo
@ 2009-09-04  1:35 ` Eric Wong
  2009-09-04 13:47   ` Iñaki Baz Castillo
  1 sibling, 1 reply; 8+ messages in thread
From: Eric Wong @ 2009-09-04  1:35 UTC (permalink / raw)
  To: rack-devel


Iñaki Baz Castillo <ibc@aliax.net> wrote:
> 
> Hi, I can't understand why the following issue occurs in the response body 
> when using CommonLogger:
> 
> 
> ----- app_logic.rb -----
> class AppLogic
>   def call(env)
>     200, {"Content-Type" => "text/plain"}, "line1\nline2\nline3\n"
>   end
> end
> ------------------------
> 
> 
> ------- run_server.rb ------
> require "app_logic.rb"
> rack_inner_app = AppLogic.new
> 
> rack_app = Rack::Builder.new {
>   use Rack::CommonLogger, $stderr
>   run rack_inner_app
> }.to_app
> 
> Rack::Handler::Thin.run rack_app
> ----------------------------
> 
> 
> 
> The reply I get in the 200 OK response is as follows:
> 
> -------------
> HTTP/1.1 200 OK
> Transfer-Encoding: chunked
> Content-Type: text/plain
> Server: OpenXDMS
> Connection: close
> 
> 6
> line1
> 
> 6
> line2
> 
> 6
> line3
> 
> 0
> 
> -------------
> 
> As you can see, the number above each real body line is the length of the line 
> below it (in hexadecimal when > 10).

This is chunked transfer encoding as defined in rfc 2616, section 3.6.1.
Any HTTP/1.1 client should be able to interpret and decode it correctly.

Both CommonLogger (from Rack 1.0) and Clogger (by default) wraps the
original response body with something that responds to #each to
correctly calculate the size of the body.  This can throw off the
Rack::ContentLength middleware that your server probably already loads
for you (the Thin and Mongrel handlers both appear to load both
Rack::Chunked and Rack::ContentLength).

For performance reasons, the next version of Rack will instead log the
existing "Content-Length" header if one exists, and '-' if it doesn't;
skipping the wrapping of the body[1].

> It occurs the same if I log to a file and also if I use Clogger instead of 
> CommonLogger.
> 
> Is there something wrong in my code? is it the expected behaviour? (I cannot 
> figure it of course as it breaks the response).

Yes, it's correct behavior, the response is not broken.

[1] - on a side note, one of the reasons I started Clogger was to
      preserve the existing body length calculation behavior.
-- 
Eric Wong

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: CommonLogger (and Clogger) generates strange symbols in the  response body
  2009-09-04  1:35 ` Eric Wong
@ 2009-09-04 13:47   ` Iñaki Baz Castillo
  2009-09-04 19:13     ` Eric Wong
  0 siblings, 1 reply; 8+ messages in thread
From: Iñaki Baz Castillo @ 2009-09-04 13:47 UTC (permalink / raw)
  To: rack-devel


2009/9/4 Eric Wong <normalperson@yhbt.net>:
>> As you can see, the number above each real body line is the length of the line
>> below it (in hexadecimal when > 10).
>
> This is chunked transfer encoding as defined in rfc 2616, section 3.6.1.
> Any HTTP/1.1 client should be able to interpret and decode it correctly.

Thanks a lot, I didn't know it.


> Both CommonLogger (from Rack 1.0) and Clogger (by default) wraps the
> original response body with something that responds to #each to
> correctly calculate the size of the body.  This can throw off the
> Rack::ContentLength middleware that your server probably already loads
> for you (the Thin and Mongrel handlers both appear to load both
> Rack::Chunked and Rack::ContentLength).
>
> For performance reasons, the next version of Rack will instead log the
> existing "Content-Length" header if one exists, and '-' if it doesn't;
> skipping the wrapping of the body[1].

Does it mean that with the next version I would get a non chunked
transfer encoded body even if I use CommonLogger?

Thanks a lot.


-- 
Iñaki Baz Castillo
<ibc@aliax.net>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: CommonLogger (and Clogger) generates strange symbols in the response body
  2009-09-04 13:47   ` Iñaki Baz Castillo
@ 2009-09-04 19:13     ` Eric Wong
  2009-09-04 19:20       ` Iñaki Baz Castillo
  0 siblings, 1 reply; 8+ messages in thread
From: Eric Wong @ 2009-09-04 19:13 UTC (permalink / raw)
  To: rack-devel


Iñaki Baz Castillo <ibc@aliax.net> wrote:
> > This is chunked transfer encoding as defined in rfc 2616, section 3.6.1.
> > Any HTTP/1.1 client should be able to interpret and decode it correctly.
> 
> Thanks a lot, I didn't know it.

No problem

> > Both CommonLogger (from Rack 1.0) and Clogger (by default) wraps the
> > original response body with something that responds to #each to
> > correctly calculate the size of the body.  This can throw off the
> > Rack::ContentLength middleware that your server probably already loads
> > for you (the Thin and Mongrel handlers both appear to load both
> > Rack::Chunked and Rack::ContentLength).
> >
> > For performance reasons, the next version of Rack will instead log the
> > existing "Content-Length" header if one exists, and '-' if it doesn't;
> > skipping the wrapping of the body[1].
> 
> Does it mean that with the next version I would get a non chunked
> transfer encoded body even if I use CommonLogger?
> 
> Thanks a lot.

Yes, however you might want to load the Rack::ContentLength middleware
in front of CommonLogger to ensure the length can get logged correctly
as a result.

-- 
Eric Wong

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: CommonLogger (and Clogger) generates strange symbols in the response body
  2009-09-04 19:13     ` Eric Wong
@ 2009-09-04 19:20       ` Iñaki Baz Castillo
  2009-09-04 19:42         ` Eric Wong
  0 siblings, 1 reply; 8+ messages in thread
From: Iñaki Baz Castillo @ 2009-09-04 19:20 UTC (permalink / raw)
  To: rack-devel


El Viernes, 4 de Septiembre de 2009, Eric Wong escribió:

> > > For performance reasons, the next version of Rack will instead log the
> > > existing "Content-Length" header if one exists, and '-' if it doesn't;
> > > skipping the wrapping of the body[1].
> >
> > Does it mean that with the next version I would get a non chunked
> > transfer encoded body even if I use CommonLogger?
> >
> 
> Yes, however you might want to load the Rack::ContentLength middleware
> in front of CommonLogger to ensure the length can get logged correctly
> as a result.

But if I use Clogger then I don't need to add Rack::ContentLength, right?

Thanks again.


-- 
Iñaki Baz Castillo <ibc@aliax.net>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: CommonLogger (and Clogger) generates strange symbols in the response body
  2009-09-04 19:20       ` Iñaki Baz Castillo
@ 2009-09-04 19:42         ` Eric Wong
  2009-09-04 19:44           ` Iñaki Baz Castillo
  0 siblings, 1 reply; 8+ messages in thread
From: Eric Wong @ 2009-09-04 19:42 UTC (permalink / raw)
  To: rack-devel


Iñaki Baz Castillo <ibc@aliax.net> wrote:
> El Viernes, 4 de Septiembre de 2009, Eric Wong escribió:
> 
> > > > For performance reasons, the next version of Rack will instead log the
> > > > existing "Content-Length" header if one exists, and '-' if it doesn't;
> > > > skipping the wrapping of the body[1].
> > >
> > > Does it mean that with the next version I would get a non chunked
> > > transfer encoded body even if I use CommonLogger?
> > >
> > Yes, however you might want to load the Rack::ContentLength middleware
> > in front of CommonLogger to ensure the length can get logged correctly
> > as a result.
> 
> But if I use Clogger then I don't need to add Rack::ContentLength, right?

With $body_bytes_sent or $response_length, then no, you don't need to
load Rack::ContentLength in front of Clogger.  But you can avoid a
chunked body if you do load Rack::ContentLength.

> Thanks again.

No problem!

-- 
Eric Wong

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: CommonLogger (and Clogger) generates strange symbols in the response body
  2009-09-04 19:42         ` Eric Wong
@ 2009-09-04 19:44           ` Iñaki Baz Castillo
  0 siblings, 0 replies; 8+ messages in thread
From: Iñaki Baz Castillo @ 2009-09-04 19:44 UTC (permalink / raw)
  To: rack-devel


El Viernes, 4 de Septiembre de 2009, Eric Wong escribió:
> With $body_bytes_sent or $response_length, then no, you don't need to
> load Rack::ContentLength in front of Clogger.  But you can avoid a
> chunked body if you do load Rack::ContentLength.

Ahh, ok, that's nice to know.

Thanks. 


-- 
Iñaki Baz Castillo <ibc@aliax.net>

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2009-09-04 20:38 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-09-03 23:02 CommonLogger (and Clogger) generates strange symbols in the response body Iñaki Baz Castillo
2009-09-03 23:28 ` Iñaki Baz Castillo
2009-09-04  1:35 ` Eric Wong
2009-09-04 13:47   ` Iñaki Baz Castillo
2009-09-04 19:13     ` Eric Wong
2009-09-04 19:20       ` Iñaki Baz Castillo
2009-09-04 19:42         ` Eric Wong
2009-09-04 19:44           ` Iñaki Baz Castillo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).