Re: [Factor-talk] Printing an HTTP response without accumulation
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
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
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