durusmail: quixote-users: Re: Help with using medusa
Help with using medusa
2004-06-18
2004-06-18
2004-06-18
2004-06-18
2004-06-18
2004-06-18
2004-06-18
2004-06-18
2004-06-18
Re: Help with using medusa
2004-06-18
2004-06-18
2004-06-18
2004-06-18
2004-06-19
2004-06-19
2004-06-19
2004-06-19
2004-06-20
Re: Help with using medusa
Graham Fawcett
2004-06-18
Vineet Jain wrote:

>>Note the assert. If, for any reason, the http_server doesn't get
>>registered with asyncore's socket map, then asyncore.loop() will exit
>>automatically, just as you described. That's why the assert is there:
>>to test whether this is the case.
>>
>>     from medusa import http_server
>>     import asyncore
>>
>>     PORT = 8080
>>     server = http_server.http_server('', PORT)
>>     assert len(asyncore.socket_map) > 0, 'server not registered!'
>>     asyncore.loop()
>>
>>What happens when you execute it?
>>
>>
>
>Gives me the following:
>
>C:\appservers\Quixote-1.0c1\server>test1.py
>warning: Computing default hostname
>info: Medusa (V1.11) started at Fri Jun 18 16:19:44 2004
>        Hostname: vinjvinj
>        Port:8080
>
>Traceback (most recent call last):
>  File "C:\appservers\Quixote-1.0c1\server\test1.py", line 6, in ?
>    assert len(asyncore.socket_map) > 0, 'server not registered!'
>AssertionError: server not registered!
>

OK, that's not right.

When you instantiated http_server(), http_server.__init__ should have
called asyncore.dispatcher.__init__, which should have called
self.add_channel() to add itself to the socket map. But for some reason
this didn't happen for you.

It could be your Medusa distribution; it could be a somehow-broken
asyncore implementation.

Okay, since we are on a roll, let's try one more test. This one will run
an execution trace starting *before* http_server is initialized.

    from medusa import http_server
    import asyncore
    import inspect
    import sys

    def trace_func(frame, event, arg):
        fn, ln, funcname, context, idx = inspect.getframeinfo(frame)
        fnln = ('%s%s:%s' % (' ' * 25, fn, ln))[-25:]
        if context:
            for line in context:
                print '%s >>> %s' % (fnln, line.rstrip())

        return trace_func

    PORT = 8080
    sys.settrace(trace_func)
    server = http_server.http_server('', PORT)
    print '-' * 70, 'starting loop'
    asyncore.loop()
    print '-' * 70, 'stopping loop'

What you get out of this should look something like this... I've just
included the significant lines at the top.

    medusa\http_server.py:543 >>>     def __init__ (self, ip, port,
resolver=None, logger_object=None):
    medusa\http_server.py:544 >>>         self.ip = ip
    medusa\http_server.py:545 >>>         self.port = port
    medusa\http_server.py:546 >>>         asyncore.dispatcher.__init__
(self)
    hon23\lib\asyncore.py:203 >>>     def __init__(self, sock=None,
map=None):
    hon23\lib\asyncore.py:204 >>>         if sock:
    hon23\lib\asyncore.py:217 >>>             self.socket = None
    hon23\lib\asyncore.py:217 >>>             self.socket = None
    medusa\http_server.py:547 >>>         self.create_socket
(socket.AF_INET, socket.SOCK_STREAM)
    hon23\lib\asyncore.py:249 >>>     def create_socket(self, family, type):
    hon23\lib\asyncore.py:250 >>>         self.family_and_type = family,
type
    hon23\lib\asyncore.py:251 >>>         self.socket =
socket.socket(family, type)
    ython23\lib\socket.py:152 >>>     def __init__(self, family=AF_INET,
type=SOCK_STREAM, proto=0, _sock=None):
    ython23\lib\socket.py:153 >>>         if _sock is None:
    ython23\lib\socket.py:154 >>>             _sock =
_realsocket(family, type, proto)
    ython23\lib\socket.py:155 >>>         self._sock = _sock
    ython23\lib\socket.py:156 >>>         self.send = self._sock.send
    ython23\lib\socket.py:157 >>>         self.recv = self._sock.recv
    ython23\lib\socket.py:158 >>>         self.sendto = self._sock.sendto
    ython23\lib\socket.py:159 >>>         self.recvfrom =
self._sock.recvfrom
    ython23\lib\socket.py:159 >>>         self.recvfrom =
self._sock.recvfrom
    hon23\lib\asyncore.py:252 >>>         self.socket.setblocking(0)
    hon23\lib\asyncore.py:253 >>>         self._fileno =
self.socket.fileno()
    hon23\lib\asyncore.py:254 >>>         self.add_channel()
    hon23\lib\asyncore.py:235 >>>     def add_channel(self, map=None):
    hon23\lib\asyncore.py:237 >>>         if map is None:
    hon23\lib\asyncore.py:238 >>>             map = socket_map
    hon23\lib\asyncore.py:239 >>>         map[self._fileno] = self
    hon23\lib\asyncore.py:239 >>>         map[self._fileno] = self
    hon23\lib\asyncore.py:254 >>>         self.add_channel()
    medusa\http_server.py:549 >>>         self.handlers = []
    medusa\http_server.py:551 >>>         if not logger_object:
    medusa\http_server.py:552 >>>             logger_object =
logger.file_logger (sys.stdout)


Note the self.add_channel() call at asyncore.py:254. That's what's
adding your HTTP server to the asyncore loop.

Run the new test, and let's see what you get.

-- Graham


reply