On 16 May 2013, at 14:41, Camillo Bruni <[email protected]> wrote:

> cool :)

Thx, it is actually very simple, just a little hack.

I wanted to make it work like your zero-conf scripts

$ curl localhost:1701/repl | bash

But that does not seem possible (after a day of fruitless bash hacking ;-): 
bash already reads its script from stdin, hence the script itself cannot read 
his own input from stdin (or so it seems).

If you would happen to know how to do it …

> On 2013-05-16, at 14:36, Sven Van Caekenberghe <[email protected]> wrote:
> 
>> Hi,
>> 
>> Here is a little tool that might be useful to some you. For others it might 
>> be a nice example.
>> 
>> So you have your shiny Pharo server application running in the cloud. When 
>> something goes wrong, most of the time you will just restart, manually or 
>> automatically. But sometimes you wish you could interact with a running 
>> headless server image. Problem is, you can't out of the box.
>> 
>> ZnReadEvalPrintDelegate is a simple tool that exports a REPL Web Service. 
>> Much like the emergency evaluator. Primitive but better than nothing. 
>> Install it on a port of your choice, running in a independent Zn HTTP 
>> server, bound to localhost only.
>> 
>>      ZnReadEvalPrintDelegate startInServerOn: 1701.
>> 
>> There is only one API method: POST a plain/text Smalltalk expression to 
>> evaluate, get the result back.       
>> 
>>      ZnClient new
>>              url: 'http://localhost:1701/repl';
>>              contents: '42 factorial';
>>              post.
>> 
>> Here is an example terminal session (logged in to the server, not remote):
>> 
>> A GET on the service /repl gives some help text
>> 
>> $ curl http://localhost:1701/repl
>> # Pharo Smalltalk REPL. POST expressions to evaluate
>> # Here is one way (type ctrl-d to end input)
>> curl -X POST -H'Content-Type:text/plain' --data-binary @- 
>> http://localhost:1701/repl
>> 
>> A POST with -d is good for short expressions
>> 
>> $ curl -X POST -H'Content-Type:text/plain' -d '42 factorial' 
>> http://localhost:1701/repl
>> 1405006117752879898543142606244511569936384000000000
>> 
>> For longer or multi line expressions you can read input from stdin and end 
>> with ctrl-d (copy the expression returned by the GET). Or you could send 
>> text files.
>> 
>> $ curl -X POST -H'Content-Type:text/plain' --data-binary @- 
>> http://localhost:1701/repl
>> { (1 to: 10) sum. (1 to: 10) average }
>> {55. (11/2)}
>> 
>> There is error handling as well:
>> 
>> $ curl -X POST -H'Content-Type:text/plain' --data-binary @- 
>> http://localhost:1701/repl
>> 1 plus: 2
>> MessageNotUnderstood: SmallInteger>>plus:
>> SmallInteger(Object)>>doesNotUnderstand: #plus:
>>      Receiver: 1
>>      Arguments and temporary variables: 
>>              aMessage:       plus: 2
>>              exception:      MessageNotUnderstood: SmallInteger>>plus:
>>              resumeValue:    nil
>>      Receiver's instance variables: 
>> 1
>> UndefinedObject>>DoIt
>> Compiler>>evaluate:in:to:notifying:ifFail:logged:
>> Compiler>>evaluate:in:to:notifying:ifFail:
>> Compiler>>evaluate:in:to:
>> ZnReadEvalPrintDelegate>>evaluate: in Block: [| result |...
>> BlockClosure>>on:do:
>> ZnReadEvalPrintDelegate>>evaluate: in Block: [:out | [| result |...
>> String class(SequenceableCollection class)>>new:streamContents:
>> 
>> WARNING: never open this service beyond your local network ! This service 
>> gives you absolute control over and access to everything in your image. For 
>> example, the following will kill your image:
>> 
>> $ curl -X POST -H'Content-Type:text/plain' -d 'Smalltalk quitPrimitive' 
>> http://localhost:1701/repl
>> 
>> All this in one class and a handful of methods.
>> 
>> Enjoy,
>> 
>> Sven
>> 
>> PS1: Part of Zinc HTTP Components, in the bleedingEdge version.
>> 
>> PS2: Of course, basic authentication or HTTPS can be added through simple Zn 
>> configuration.
>> 
>> --
>> Sven Van Caekenberghe
>> Proudly supporting Pharo
>> http://pharo.org
>> http://association.pharo.org
>> http://consortium.pharo.org
>> 
>> 
>> 
>> 
>> 
> 
> 


Reply via email to