Re: [Factor-talk] Printing an HTTP response without accumulation

2009-01-12 Thread Ludovic Kuty
Thank you for the answer. I defined a new symbol to have access to  
stdout and then used with-output-stream* (doesn't work well without  
the * of course). Dynamic scope proves to be really useful.

USING: kernel sequences combinators io io.sockets io.encodings.ascii  
prettyprint namespaces ;
IN: scratchpad
SYMBOL: old-output-stream

output-stream get old-output-stream set

"www.google.com" 80 
ascii
[
   "GET / HTTP/1.0\r\n\r\n" write flush
   old-output-stream get [ [ . ] each-line ] with-output-stream*
]
with-client

Could you explain why "output-stream get" and "output-stream get- 
global" return different values ?

( scratchpad ) output-stream get

--- Data stack:
T{ pane-stream f ~pane~ }
( scratchpad ) output-stream get-global

--- Data stack:
T{ pane-stream f ~pane~ }
T{ encoder f ~output-port~ utf8 }
( scratchpad )

Ludovic Kuty

On 11 Jan 2009, at 21:54, Slava Pestov wrote:

> Hi,
>
> You can work with multiple streams at a time by using the stream-*
> words, instead of words such as readln. For example, readln is defined
> as
>
> : readln ( -- line ) input-stream get stream-readln ;
>
> If you use the stream-* version, you can pass the stream around on the
> stack or put it in a variable, and work with multiple streams. You
> still have to use with-disposal or with-destructors to ensure the
> streams get closed in the event of an error. Also,
>
> [ readln dup ] [ ] [ drop ] produce
>
> is the same same as
>
> input-stream get lines
>
> There is also an each-line combinator which applies a quotation to
> each line; this runs in constant space, instead of 'lines' which
> slurps everything into memory.
>
> Hope this helps,
>
> Slava
>
> On Sun, Jan 11, 2009 at 6:27 AM, Ludovic Kuty  wrote:
>> Hello,
>>
>> I want to print the response given by a Web server using socket
>> primitives (not an HTTP library). I managed to produce the following
>> working code running in the factor Workspace.
>>
>> USING: io.sockets io.encodings.ascii ;
>> "www.google.com" 80 
>> ascii
>> [
>>  "GET / HTTP/1.0\r\n\r\n" write flush
>>  [ readln dup ] [ ] [ drop ] produce
>> ]
>> with-client
>> [ . ] each
>>
>> But if I prefer to print the HTTP reponse directly in the quotation
>> used by with-client instead of returning a result and then printing  
>> it
>> with "[ . ] each", what should I do ?
>>
>> Indeed the default input and output streams are rebound by with- 
>> client
>> and thus  inside the quotation I do not have access to stdout (the
>> output stream to the console). It took me some time to realize this
>> and have a working code. I thought of getting access to the output
>> stream stored in the global namespace but it doesn't work (\ output-
>> stream get-global). In fact that doesn't make sense maybe. I also
>> thought of using with-output-stream but I can't see how to place it  
>> in
>> the code since I need two different output-streams at the same time.
>>
>> Also, if you have any comment, insight or remark about the code,
>> please let me know.
>>
>> Thank in advance,
>>
>> Ludovic Kuty
>>
>> OUTPUT:
>>
>> "HTTP/1.0 302 Found"
>> "Location: http://www.google.be/";
>> "Cache-Control: private"
>> "Content-Type: text/html; charset=UTF-8"
>> "Set-Cookie:
>> PREF
>> =ID=db53d028f07bf514:TM=1231675166:LM=1231675166:S=x-4Mym8gM1pvKy6Y;
>> expires=Tue, 11-Jan-2011 11:59:26 GMT; path=/; domain=.google.com"
>> "Date: Sun, 11 Jan 2009 11:59:26 GMT"
>> "Server: gws"
>> "Content-Length: 218"
>> ""
>> "> html;charset=utf-8\">"
>> "302 Moved"
>> "302 Moved"
>> "The document has moved"
>> "http://www.google.be/\";>here."
>> ""
>>
>>
>>
>> --
>> Check out the new SourceForge.net Marketplace.
>> It is the best place to buy or sell services for
>> just about anything Open Source.
>> http://p.sf.net/sfu/Xq1LFB
>> ___
>> Factor-talk mailing list
>> Factor-talk@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/factor-talk
>>
>
> --
> Check out the new SourceForge.net Marketplace.
> It is the best place to buy or sell services for
> just about anything Open Source.
> http://p.sf.net/sfu/Xq1LFB
> ___
> Factor-talk mailing list
> Factor-talk@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/factor-talk


--
Check out the new SourceForge.net Marketplace.
It is the best place to buy or sell services for
just about anything Open Source.
http://p.sf.net/sfu/Xq1LFB
___
Factor-talk mailing list
Factor-talk@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/factor-talk


Re: [Factor-talk] Printing an HTTP response without accumulation

2009-01-11 Thread Slava Pestov
Hi,

You can work with multiple streams at a time by using the stream-*
words, instead of words such as readln. For example, readln is defined
as

: readln ( -- line ) input-stream get stream-readln ;

If you use the stream-* version, you can pass the stream around on the
stack or put it in a variable, and work with multiple streams. You
still have to use with-disposal or with-destructors to ensure the
streams get closed in the event of an error. Also,

[ readln dup ] [ ] [ drop ] produce

is the same same as

input-stream get lines

There is also an each-line combinator which applies a quotation to
each line; this runs in constant space, instead of 'lines' which
slurps everything into memory.

Hope this helps,

Slava

On Sun, Jan 11, 2009 at 6:27 AM, Ludovic Kuty  wrote:
> Hello,
>
> I want to print the response given by a Web server using socket
> primitives (not an HTTP library). I managed to produce the following
> working code running in the factor Workspace.
>
> USING: io.sockets io.encodings.ascii ;
> "www.google.com" 80 
> ascii
> [
>   "GET / HTTP/1.0\r\n\r\n" write flush
>   [ readln dup ] [ ] [ drop ] produce
> ]
> with-client
> [ . ] each
>
> But if I prefer to print the HTTP reponse directly in the quotation
> used by with-client instead of returning a result and then printing it
> with "[ . ] each", what should I do ?
>
> Indeed the default input and output streams are rebound by with-client
> and thus  inside the quotation I do not have access to stdout (the
> output stream to the console). It took me some time to realize this
> and have a working code. I thought of getting access to the output
> stream stored in the global namespace but it doesn't work (\ output-
> stream get-global). In fact that doesn't make sense maybe. I also
> thought of using with-output-stream but I can't see how to place it in
> the code since I need two different output-streams at the same time.
>
> Also, if you have any comment, insight or remark about the code,
> please let me know.
>
> Thank in advance,
>
> Ludovic Kuty
>
> OUTPUT:
>
> "HTTP/1.0 302 Found"
> "Location: http://www.google.be/";
> "Cache-Control: private"
> "Content-Type: text/html; charset=UTF-8"
> "Set-Cookie:
> PREF
> =ID=db53d028f07bf514:TM=1231675166:LM=1231675166:S=x-4Mym8gM1pvKy6Y;
> expires=Tue, 11-Jan-2011 11:59:26 GMT; path=/; domain=.google.com"
> "Date: Sun, 11 Jan 2009 11:59:26 GMT"
> "Server: gws"
> "Content-Length: 218"
> ""
> " html;charset=utf-8\">"
> "302 Moved"
> "302 Moved"
> "The document has moved"
> "http://www.google.be/\";>here."
> ""
>
>
>
> --
> Check out the new SourceForge.net Marketplace.
> It is the best place to buy or sell services for
> just about anything Open Source.
> http://p.sf.net/sfu/Xq1LFB
> ___
> Factor-talk mailing list
> Factor-talk@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/factor-talk
>

--
Check out the new SourceForge.net Marketplace.
It is the best place to buy or sell services for
just about anything Open Source.
http://p.sf.net/sfu/Xq1LFB
___
Factor-talk mailing list
Factor-talk@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/factor-talk


[Factor-talk] Printing an HTTP response without accumulation

2009-01-11 Thread Ludovic Kuty
Hello,

I want to print the response given by a Web server using socket  
primitives (not an HTTP library). I managed to produce the following  
working code running in the factor Workspace.

USING: io.sockets io.encodings.ascii ;
"www.google.com" 80 
ascii
[
   "GET / HTTP/1.0\r\n\r\n" write flush
   [ readln dup ] [ ] [ drop ] produce
]
with-client
[ . ] each

But if I prefer to print the HTTP reponse directly in the quotation  
used by with-client instead of returning a result and then printing it  
with "[ . ] each", what should I do ?

Indeed the default input and output streams are rebound by with-client  
and thus  inside the quotation I do not have access to stdout (the  
output stream to the console). It took me some time to realize this  
and have a working code. I thought of getting access to the output  
stream stored in the global namespace but it doesn't work (\ output- 
stream get-global). In fact that doesn't make sense maybe. I also  
thought of using with-output-stream but I can't see how to place it in  
the code since I need two different output-streams at the same time.

Also, if you have any comment, insight or remark about the code,  
please let me know.

Thank in advance,

Ludovic Kuty

OUTPUT:

"HTTP/1.0 302 Found"
"Location: http://www.google.be/";
"Cache-Control: private"
"Content-Type: text/html; charset=UTF-8"
"Set-Cookie:  
PREF 
=ID=db53d028f07bf514:TM=1231675166:LM=1231675166:S=x-4Mym8gM1pvKy6Y;  
expires=Tue, 11-Jan-2011 11:59:26 GMT; path=/; domain=.google.com"
"Date: Sun, 11 Jan 2009 11:59:26 GMT"
"Server: gws"
"Content-Length: 218"
""
""
"302 Moved"
"302 Moved"
"The document has moved"
"http://www.google.be/\";>here."
""



--
Check out the new SourceForge.net Marketplace.
It is the best place to buy or sell services for
just about anything Open Source.
http://p.sf.net/sfu/Xq1LFB
___
Factor-talk mailing list
Factor-talk@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/factor-talk