<html>
<head>
</head>
<body>
One of the biggest pains of doing work with http is<br>
trying to keep track of what's going on in a complex<br>
multistage transaction, when http itself is "stateless".<br>
<br>
This generally results in lots of hidden variables and<br>
the usual state-machine code obfuscation.<br>
<br>
Just wanted to share that I'm having some success<br>
keeping track of "sessions" using tasklets that get "reconnected"<br>
to http interactions within an http server. &nbsp;My first test<br>
for managing sessions within the framework looks like this<br>
at present..<br>
<br>
<br>
def testprocessor(session, channel, scheduler):<br>
&nbsp;&nbsp;&nbsp; donesignal = None<br>
&nbsp;&nbsp;&nbsp; try:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # generate fibonnaci numbers<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a = b = 1<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memo = "guest"<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for i in range(6):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # finish last interaction<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if donesignal is not None:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; donesignal.send(1)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # wait for next connection for this session<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (dictionary, socket, Sock, addr, donesignal, debug) = channel.receive()
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scheduler.send(socket, "HTTP/1.0 200 OK\r\n")<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scheduler.send(socket, "Content-type: text/html\r\n")<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scheduler.send(socket, "\r\n")<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scheduler.send(socket, """<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Welcome %s to session %s&lt;hr&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=%s a=%s b=%s&lt;br&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;a href="test.cgi?session=%s"&gt;go around again!&lt;/a&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """ % (memo, session, i, a, b, session,))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a, b = b, a+b<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memo = "back"<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scheduler.send(socket, "&lt;h3&gt;This session is done now&lt;/h3&gt;")<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; donesignal.send(1)<br>
&nbsp;&nbsp;&nbsp; finally:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if donesignal is not None and donesignal.balance&lt;0: # ???<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; donesignal.send(1)<br>
<br>
In the session tasklet this function generates 6 screens in sequence when
the user presses<br>
"go around again". &nbsp;The first looks like this:<br>
<br>
Welcome guest to&nbsp;session 1031330478.68
<hr>             i=0 a=1 b=1<br>
<a href="http://localhost:8000/test.cgi?session=1031330368.23">go around
again!</a>
<br>
<br>
and the last looks like this<br>
<br>
Welcome back to session 1031330478.68
<hr>             i=5 a=8 b=13<br>
<a href="http://localhost:8000/test.cgi?session=1031330478.68">go around
again!</a>
<h3>This session is done now</h3>
The interesting thing is that this is "straight line code" even though<br>
the 6 http interactions are independent.<br>
<br>
Having implemented more &nbsp;HTTP state machines than a sane person should<br>
be permitted on one lifetime I'm finding this alternative quite refreshing
:).<br>
Comments?<br>
<br>
I'll share &nbsp;some code once I've played a bit more.<br>
<br>
&nbsp; &nbsp;-- Aaron Watters<br>
<br>
<br>
</body>
</html>