ANN: Beta Available of ServerWorkz (a.k.a The revHTTPd Project)
Andre Garzia
soapdog at mac.com
Mon Mar 8 20:38:33 EST 2004
Hi Folks,
I've been fiddling with HTTP and Rev for some time, now and them I
posted some news here. Many people visited the server and got
interested in the project. Now it's time to release the code. For those
that do not know what this project is or what it is able to do, I'll do
a quick and dirty resume here. but the best way to learn about it is
thru it's about page. Try http://home.soapdog.org:8081/about?card=1
This will take you to a server and possibilities tour, much better and
well written than this quick hack here. The stacks are available from
http://public.soapdog.org The demo server is running here at
http://home.soapdog.org:8081/
Cheers
Andre
--- What is ServerWorkz/RevHTTPd Project?
------------------------------------------------------------------------
------------------------
It's the implementation of a fully functional web server/framework in
Revolution. While we do not plan to overtake Apache, we've got some
UberCool features that will impresse everyone. This stack is a heavy
modified version of old Metacard HTTPd Stack. I stripped out many
things but added tons of code too, so You might not recognize it. The
server is able to serve local files from the HTML folder and to serve
stacks as dynamic pages (lot's of stunts here). Local files may
interface to revolution using special Inform2 Tags. Dynamic files might
be substacks of the server, local .Rev files inside the Modules folder
or any stack that is loaded in runtime (like everything in the IDE...).
The server is very advanced and it's even able to transport data from
HTML to Stacks automatically.
Any stack can be served this way. You can set the server to any port
you want and you can even embedd it in your own app (it's just a button
to be placed in the back). You can allow it to serve local files or use
it only for dynamic content. Server default to port 8081. Sou you can
try to access my home server by pointing your browser to
http://home.soapdog.org:8081/
--- How To Flush things to the browser
------------------------------------------------------------------------
----------------------------------
To echo content to the browser you use the http_flush handler, it's
like this:
http_flush "text/html", "hello world"
first parameter is the mime type, the second is the content. Other good
function is http_redirect that accepts one parameter and forces a
redirection. Use it like:
http_redirect "http://www.yahoo.com"
That will force browser to redirect to Yahoo! Page.
--- Understanding what happens inside the server when browser asks for
a stack. -----------------------------------------------
When user connect to the server, it asks for a document. This document
might be a local stored file or a stack. In the case of a file it is
just flushed to the browser. In case of a stack it's more complex. For
your stack to be served it must implement (well, it should implement)
the default handler "default_html". So suppose you want a helloworld
stack, just add this to a stack
on default_html
http_flush "text/html", "Hello World!"
end default_html
you'll be able to access this exact script from
http://home.soapdog.org:8081/helloworld
But that's not all, we've got a cool URL mapping scheme. Let's talk
about it.
--- About URL Mapping scheme
------------------------------------------------------------------------
----------------------------------------------
/Stack ---> Send default_html to the stack.
/Stack/Message ---> Send message to the Stack
/Stack/Card/Message ---> Send message to card of stack.
/Stack/Card/Button/Message ---> Send message to button of card of
stack (this is like a design decision, messages default to button if no
object type is present)
/Stack/Card/ObjectType/ObjectName/Msg ---> Send msg to obj of card of
stack like: /MainStack/1/field/email/clearText (would send "clearText"
to field email)
This way I can for example access a URL a button like this
http://home.soapdog.org:8081/quotes/2/button/refreshquotes/mouseUp,
this would trigger the mouseUp of button adduote on card 2 of stack
quotes. Pretty easy! Enought for URLs.
The server is now supporting the POST method and GET method, it will
look for POST Data and look inside document request URL for GET data...
it will map HTML/URL Field names to Revolution Field names, so if I
access http://home.soapdog.org:8081/about?card=1 it will look for stack
"about" and for a text field named card in it, if it find one it will
fill it with "1", Thats automatic. It fills the fields before sending
the message (so that you can proccess them). This way you can write
whole web apps just by using our familiar ways of stacks, cards, fields
and messages.
We created a Revolution Field to Web Engine called Inform2. Inform2 can
take any card of any stack and will parse it taking all fields and
making a nice HTML form of it. It will fill the form with the currrent
fields values, and since the server do the map back automatically, you
can focus on the "processPost" message that is sent to your stack for
the rest is taken care.
For you all to wonder, with this framework I was able to create a Blog
engine in 10 lines, was able to create a Fotolog engine in also 10
lines. I created a Instant Message in some 30 lines.
--- More on Inform2
------------------------------------------------------------------------
----------------------------------------------------------------
Inform2 is a frontscript used to make the server even better. It was
created after reading Mr Dar Scott message primer and looking inside
LibCGI code.
Inform2 adds the following
* New ways to access server data.
In previous version, revHTTPd would match field names to the field
names acquired from POST or GET Methods, thus if you used a form with a
field named email or a url like
http://yourhost/yourStack?email=soapdog@mac.com it would get the email
value and fill the email field of the desired stack with it. Now you
also have the option to access it in a nice global array called gDataA
(This is inspired by LibCGI, thats how it handles), this way, you can
access non expected fields and also you will be able to access the data
without creating fields for everything.
* Cookies!
After seeing the code from libCGI, I finally understood how HTTP
handles cookies (it's not covered with HTTP Made Easy - my main
learning book), so I put cookie support with a function called
"http_flush_with_cookies" that will flush a response and also set
cookies based on a array parameter. The current browser cookies will be
inside gDataA array.(it's not working in RC1)
* New packaging! :D
revHTTPd was first a stack, then a button, now... now it still a
button, but since I learned much from message primer by Mr Dar Scott
and from message path article at Fourth World Embassy, I figured out
that inserting button "httpd" into back would be very good, this way we
can guarantee that it always receive the message and that the handlers
are available everywhere.
* Brand new and improved and over-powerfull template engine.
We created Inform2, our new template engine. This is a frontscript that
overdrive normal http_flush, this way, besides the normal template tags
%BODY%, %STACKNAME%, %TITLE%, we've got some ubercool tags like:
Inform-field tag: This one will insert a field from any card or stack,
to be used like [inform-field: passwordField stack: User Database card:
andre garzia] this would insert the content of field "passwordField" of
card "andre garzia" of stack "User Database". You can omit the card:
parameter and it will act on current card.
Inform-property tag: the same as above but insert a custom property.
Used like [inform-property: cHits stack: serverworkz card: 1] where
card parameter is optional.
Inform-throw tag: will send a message thru message path, like
[inform-throw: closeStack stack: about], when inform2 engine find this
tag it sends a message, this is good for using static html to send
messages and stuff. For example, inform-field is proccessed before
inform-throw, so you can make voodoo things like [inform-throw:
[inform-field: messageField stack: messageSelector] stack:
messageDestination], can you guess what this one will do... that's
evil!!! :D
Must say that it was after seeing WebMerge from Fourth World that I
thought of custom tags thru Regular Expressions, I thought: "They did
that with metacard, so there must be a way". After couple minutes
search I found matchText command and a primer on Regular Expressions on
the net.
--- More? Licensing and the like
------------------------------------------------------------------------
------------------------------------------------------------------------
-----------
Well this was a copy & paste from previous messages with some new words
in it. What you should have in mind is that ServerWorkz is not a simple
webserver nor is a CGI lib. It's something very different. It's a
conduit between Revolution and the HTTP speaking world. You can use it
to serve pages, sure. You can use it for CGI, yes. But you can use it
as a networking lib for interapplication communication for example. You
can make two apps talk to each other with no fuss. Just add the server
to both, use something like zeroconf to discover each other and use
http_flush to send text and actions.
Simple apps like address books, simple user databases, are pretty easy.
You can check the modules folder for the RegisterUser.rev stack and
you'll see what I am talking about. It's a dozen lines for all the code
you need to make that user database you see on the page. By inspecting
the modules you'll see how I did everything for I am too lazy to
document all the aspects of the server. This will be done in the
future. It's enought to say that everything goes inside the code of
button "httpd" and in it's custom properties (that's where templates
and configurations are stored), the button "inform2" will take care of
all that RegEx template stuff and the automatic field to web generator.
I am always here to answer about everything. My machine is running 24/7
and the server is always up (unless when I break it by adding new
features). The server is running at http://home.soapdog.org:8081/ and
you can grab it as serverworkzbeta.zip inside http://public.soapdog.org
This code is being made public, fiddle with it as you like it but
giving me credit will attract good karma for you, and donating to this
project will attract good karma to you and you familly. Bear in mind
that I am 23, living in Brazil coursing film school. Life here is very
very hard, my salary is R$220 (U$75), it's hard to have time to code
when you need to fill your time with freelance work so that you got the
means to take your girl to the movies and eat every day. my paypal
account is agarzia at mac.com.
I can do custom work using this framework (I understand it better than
anyone ;-) ) This is the base of some solutions I am working, and I am
releasing it for I feel that everyone can benefit from it, and that
this can be a killer thing for Revolution. Please send feedback to me
at soapdog at mac.com and if you feel like helping me just send code,
suggestions, bug reports, advise and the like.
Well, cheers, fiddle with the code!
Andre Garzia
--
Andre Alves Garzia ð 2004
Soap Dog Studios - BRAZIL
http://studio.soapdog.org
More information about the use-livecode
mailing list