<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#ffffff" text="#000000">
    Googling "http proxy python" turned up:<br>
    <br>
    <a class="moz-txt-link-freetext" href="http://proxies.xhaus.com/python/">http://proxies.xhaus.com/python/</a><br>
    <br>
    among other things.<br>
    <pre class="moz-signature" cols="72">--------------------------------------
Randy Syring
Intelicom
Direct: 502-276-0459
Office: 502-212-9913

For the wages of sin is death, but the
free gift of God is eternal life in 
Christ Jesus our Lord (Rom 6:23)
</pre>
    <br>
    On 12/16/2010 02:18 PM, RayS wrote:
    <blockquote
      cite="mid:6.2.3.4.2.20101216110911.028b8a90@pop-server.san.rr.com"
      type="cite">
      <font color="#800000">I was playing with some simple code I found
        for a
        proxy server, made some mods to trap exceptions it had etc, but
        still
        have odd behavior; one that (with Firefox at least) when the
        browser
        proxy is set to 127.0.0.1:8080, DNS seems to be cached, or ?.<br>
        I run the script locally and browse through it to a web site -
        mostly OK.
        But sometimes going to a new site just brings up the home page
        of the
        last site, ie, the base URL. I tried forcing gc, but no help
        there. The
        script seems to take a request for a new URL and simple return
        the host
        of the last URL.<br>
        <br>
        Also, craigslist.org fails entirely.<br>
        Suggestions?<br>
        Links to better proxy code to study?<br>
        <br>
        -Ray<br>
        <br>
        <br>
        <br>
      </font><font size="2">==============================================<br>
        # -*- coding: cp1252 -*-<br>
        # &lt;PythonProxy.py&gt;<br>
        #<br>
        #Copyright (c) &lt;2009&gt; &lt;F&aacute;bio Domingues - fnds3000 in
        gmail.com&gt;<br>
        #<br>
        #Permission is hereby granted, free of charge, to any person<br>
        #obtaining a copy of this software and associated documentation<br>
        #files (the "Software"), to deal in the Software without<br>
        #restriction, including without limitation the rights to use,<br>
        #copy, modify, merge, publish, distribute, sublicense, and/or
        sell<br>
        #copies of the Software, and to permit persons to whom the<br>
        #Software is furnished to do so, subject to the following<br>
        #conditions:<br>
        #<br>
        #The above copyright notice and this permission notice shall be<br>
        #included in all copies or substantial portions of the Software.<br>
        #<br>
        #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
        KIND,<br>
        #EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES<br>
        #OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND<br>
        #NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT<br>
        #HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,<br>
        #WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING<br>
        #FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR<br>
        #OTHER DEALINGS IN THE SOFTWARE.<br>
        <br>
        """\<br>
        Copyright (c) &lt;2009&gt; &lt;F&aacute;bio Domingues - fnds3000 in
        gmail.com&gt; &lt;MIT Licence&gt;<br>
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        **************************************<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        *** Python Proxy - A Fast HTTP proxy ***<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        **************************************<br>
        <br>
        Neste momento este proxy &eacute; um Elie Proxy.<br>
        <br>
        Suporta os m&eacute;todos HTTP:<br>
        &nbsp;- OPTIONS;<br>
        &nbsp;- GET;<br>
        &nbsp;- HEAD;<br>
        &nbsp;- POST;<br>
        &nbsp;- PUT;<br>
        &nbsp;- DELETE;<br>
        &nbsp;- TRACE;<br>
        &nbsp;- CONENCT.<br>
        <br>
        Suporta:<br>
        &nbsp;- Conex&otilde;es dos cliente em IPv4 ou IPv6;<br>
        &nbsp;- Conex&otilde;es ao alvo em IPv4 e IPv6;<br>
        &nbsp;- Conex&otilde;es todo o tipo de transmiss&atilde;o de dados TCP (CONNECT
        tunneling),<br>
        &nbsp;&nbsp;&nbsp;&nbsp; p.e. liga&ccedil;&otilde;es SSL, como &eacute; o caso do
        HTTPS.<br>
        <br>
        A fazer:<br>
        &nbsp;- Verificar se o input vindo do cliente est&aacute; correcto;<br>
        &nbsp;&nbsp; - Enviar os devidos HTTP erros se n&atilde;o, ou simplesmente
        quebrar a liga&ccedil;&atilde;o;<br>
        &nbsp;- Criar um gestor de erros;<br>
        &nbsp;- Criar ficheiro log de erros;<br>
        &nbsp;- Colocar excep&ccedil;&otilde;es nos s&iacute;tios onde &eacute; previs&iacute;vel a ocorr&ecirc;ncia
        de
        erros,<br>
        &nbsp;&nbsp;&nbsp;&nbsp; p.e.sockets e ficheiros;<br>
        &nbsp;- Rever tudo e melhorar a estrutura do programar e colocar
        nomes
        adequados nas<br>
        &nbsp;&nbsp;&nbsp;&nbsp; vari&aacute;veis e m&eacute;todos;<br>
        &nbsp;- Comentar o programa decentemente;<br>
        &nbsp;- Doc Strings.<br>
        <br>
        Funcionalidades futuras:<br>
        &nbsp;- Adiconar a funcionalidade de proxy an&oacute;nimo e transparente;<br>
        &nbsp;- Suportar FTP?.<br>
        <br>
        <br>
        (!) Aten&ccedil;&atilde;o o que se segue s&oacute; tem efeito em conex&otilde;es n&atilde;o
        CONNECT, para
        estas o<br>
        &nbsp;proxy &eacute; sempre Elite.<br>
        <br>
        Qual a diferen&ccedil;a entre um proxy Elite, An&oacute;nimo e Transparente?<br>
        &nbsp;- Um proxy elite &eacute; totalmente an&oacute;nimo, o servidor que o recebe
        n&atilde;o
        consegue ter<br>
        &nbsp;&nbsp;&nbsp;&nbsp; conhecimento da exist&ecirc;ncia do proxy e n&atilde;o recebe
        o endere&ccedil;o IP do cliente;<br>
        &nbsp;- Quando &eacute; usado um proxy an&oacute;nimo o servidor sabe que o cliente
        est&aacute; a usar um<br>
        &nbsp;&nbsp;&nbsp;&nbsp; proxy mas n&atilde;o sabe o endere&ccedil;o IP do
        cliente;<br>
        &nbsp;&nbsp;&nbsp;&nbsp; &Eacute; enviado o cabe&ccedil;alho HTTP
        "Proxy-agent".<br>
        &nbsp;- Um proxy transparente fornece ao servidor o IP do cliente e
        um
        informa&ccedil;&atilde;o que<br>
        &nbsp;&nbsp;&nbsp;&nbsp; se est&aacute; a usar um proxy.<br>
        &nbsp;&nbsp;&nbsp;&nbsp; S&atilde;o enviados os cabe&ccedil;alhos HTTP
        "Proxy-agent" e "HTTP_X_FORWARDED_FOR".<br>
        <br>
        """<br>
        <br>
        import socket, thread, select, sys, gc<br>
        <br>
        __version__ = '0.1.0 Draft 1'<br>
        BUFLEN = 4196 #8192<br>
        VERSION = 'Python Proxy/'+__version__<br>
        HTTPVER = 'HTTP/1.1'<br>
        <br>
        class ConnectionHandler:<br>
        &nbsp;&nbsp;&nbsp; def __init__(self, connection, address, timeout):<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.client = connection<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.client_buffer = ''<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.timeout = timeout<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.method, self.path,
        self.protocol = self.get_base_header()<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if
        self.method=='CONNECT':<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        self.method_CONNECT()<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif self.method in
        ('OPTIONS', 'GET', 'HEAD', 'POST', 'PUT',<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        'DELETE', 'TRACE'):<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        self.method_others()<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print '&nbsp; closing
        client', self.client<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.client.close()<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print '&nbsp; closing
        target', self.target<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.target.close()<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print '&nbsp; closed'#,
        self.client, self.target<br>
        <br>
        &nbsp;&nbsp;&nbsp; def get_base_header(self):<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while 1:<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        self.client_buffer += self.client.recv(BUFLEN)<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end =
        self.client_buffer.find('\n')<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if
        end!=-1:<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        break<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print
        '%s'%self.client_buffer[:end]#debug<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print ' bs
        %s...'%self.client_buffer[:40]#debug<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data =
        (self.client_buffer[:end+1]).split()<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.client_buffer =
        self.client_buffer[end+1:]<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return data<br>
        <br>
        &nbsp;&nbsp;&nbsp; def method_CONNECT(self):<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        self._connect_target(self.path)<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.client.send(HTTPVER+' 200
        Connection established\n'+<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        'Proxy-agent: %s\n\n'%VERSION)<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.client_buffer = ''<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "CONNECT",
        self.path[:35]<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        self._read_write()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
        <br>
        &nbsp;&nbsp;&nbsp; def method_others(self):<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.path = self.path[7:]<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = self.path.find('/')<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; host =
        self.path[:i]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path = self.path[i:]<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        self._connect_target(host)<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.target.send('%s %s
        %s\n'%(self.method, path, self.protocol)+<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        self.client_buffer)<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.client_buffer = ''<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print " M",
        self.method, host, 'pth:', self.path[:10]<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._read_write()<br>
        <br>
        &nbsp;&nbsp;&nbsp; def _connect_target(self, host):<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = host.find(':')<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if i!=-1:<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; port =
        int(host[i+1:])<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; host =
        host[:i]<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; port =
        80<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (soc_family, _, _, _, address)
        = socket.getaddrinfo(host, port)[0]<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.target =
        socket.socket(soc_family)<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        self.target.connect(address)<br>
        <br>
        &nbsp;&nbsp;&nbsp; def _read_write(self):<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; time_out_max =
        self.timeout#/3<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; socs = [self.client,
        self.target]<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; count = 0<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data = ''<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while 1:<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; count
        += 1<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (recv,
        _, error) = select.select(socs, [], socs, 3)<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if
        error:<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        break<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if
        recv:<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        for in_ in recv:<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        try:<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        data = in_.recv(BUFLEN)<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        #print "&nbsp;&nbsp;&nbsp; OK:recv data:'%s'..., len:%d,
        BUF:%d" % \<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        #&nbsp;&nbsp; (data[11:35], len(data), BUFLEN)<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        except socket.error, (errno, strerror):<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        if errno!=10053 and errno!=10054: ## 'Software caused connection
        abort'
        or reset<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        print "&nbsp;&nbsp;&nbsp; recv error", (errno, strerror)<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        print "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data:'%s'..., len:%d,
        BUF:%d" % \<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        (data[11:35], len(data), BUFLEN)<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        pass<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        else:<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        break<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        except:<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        print ' ERR', sys.exc_info()[0]<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        if in_ is self.client:<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        out = self.target<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        else:<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        out = self.client<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        if data:<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        try:<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        out.send(data)<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        except socket.error, (errno, strerror):<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        if errno!=10053 and errno!=10054: ## 'Software caused connection
        abort'
        or reset<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        print "&nbsp;&nbsp;&nbsp; send error", (errno, strerror)<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        print "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data:'%s'..., len:%d" %
        \<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        (data[:35], len(data))<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        pass<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        else:<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        break<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        except:<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        print ' ERR', sys.exc_info()[0]<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        count = 0<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if
        count == time_out_max:<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        break<br>
        <br>
        def start_server(host='localhost', port=8080, IPv6=False,
        timeout=10,<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        handler=ConnectionHandler):<br>
        &nbsp;&nbsp;&nbsp; gc.enable()<br>
        &nbsp;&nbsp;&nbsp; if IPv6==True:<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; soc_type=socket.AF_INET6<br>
        &nbsp;&nbsp;&nbsp; else:<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; soc_type=socket.AF_INET<br>
        &nbsp;&nbsp;&nbsp; socket.setdefaulttimeout(3) <br>
        &nbsp;&nbsp;&nbsp; soc = socket.socket(soc_type)<br>
        &nbsp;&nbsp;&nbsp; soc.setblocking(1) <br>
        &nbsp;&nbsp;&nbsp; #print dir(soc)<br>
        &nbsp;&nbsp;&nbsp; soc.bind((host, port))<br>
        &nbsp;&nbsp;&nbsp; print "Serving on %s:%d."%(host,
        port)#debug<br>
        &nbsp;&nbsp;&nbsp; soc.listen(0)<br>
        &nbsp;&nbsp;&nbsp; while 1:<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print 'new thread, collected',
        gc.collect(), gc.garbage<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        thread.start_new_thread(handler, soc.accept()+(timeout,))<br>
        <br>
        if __name__ == '__main__':<br>
        &nbsp;&nbsp;&nbsp; start_server()<br>
      </font>
      <pre wrap="">
<fieldset class="mimeAttachmentHeader"></fieldset>
_______________________________________________
python-win32 mailing list
<a class="moz-txt-link-abbreviated" href="mailto:python-win32@python.org">python-win32@python.org</a>
<a class="moz-txt-link-freetext" href="http://mail.python.org/mailman/listinfo/python-win32">http://mail.python.org/mailman/listinfo/python-win32</a>
</pre>
    </blockquote>
  </body>
</html>