home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2009 June / maximum-cd-2009-06.iso / DiscContents / digsby_setup.exe / lib / util / urllib2_file.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-02-26  |  6.2 KB  |  239 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. from urllib2 import URLError
  5. from urllib import splittype
  6. from urllib import splithost
  7. from httplib import NotConnected
  8. from urllib import addinfourl
  9. import os
  10. import socket
  11. import sys
  12. import stat
  13. import mimetypes
  14. import mimetools
  15. import httplib
  16. import urllib
  17. import urllib2
  18. CHUNK_SIZE = 65536
  19.  
  20. def get_content_type(filename):
  21.     if not mimetypes.guess_type(filename)[0]:
  22.         pass
  23.     return 'application/octet-stream'
  24.  
  25.  
  26. def send_data(v_vars, v_files, boundary, sendfunc = None):
  27.     l = 0
  28.     for k, v in v_vars:
  29.         buffer = ''
  30.         buffer += '--%s\r\n' % boundary
  31.         buffer += 'Content-Disposition: form-data; name="%s"\r\n' % k
  32.         buffer += '\r\n'
  33.         buffer += v + '\r\n'
  34.         if sendfunc:
  35.             sendfunc(buffer)
  36.         
  37.         l += len(buffer)
  38.     
  39.     for k, v in v_files:
  40.         fd = v
  41.         if hasattr(fd, 'len'):
  42.             file_size = fd.len
  43.         else:
  44.             file_size = os.fstat(fd.fileno())[stat.ST_SIZE]
  45.         if isinstance(k, tuple):
  46.             (k, name) = k
  47.         else:
  48.             name = fd.name.split('/')[-1]
  49.         if isinstance(name, unicode):
  50.             name = name.encode('UTF-8')
  51.         
  52.         buffer = ''
  53.         buffer += '--%s\r\n' % boundary
  54.         buffer += 'Content-Disposition: form-data; name="%s"; filename="%s"\r\n' % (k, name)
  55.         buffer += 'Content-Type: %s\r\n' % get_content_type(name)
  56.         buffer += 'Content-Length: %s\r\n' % file_size
  57.         buffer += '\r\n'
  58.         l += len(buffer)
  59.         if sendfunc:
  60.             sendfunc(buffer)
  61.             if hasattr(fd, 'seek'):
  62.                 fd.seek(0)
  63.             
  64.             while True:
  65.                 chunk = fd.read(CHUNK_SIZE)
  66.                 if not chunk:
  67.                     break
  68.                 
  69.                 sendfunc(chunk)
  70.         
  71.         l += file_size
  72.     
  73.     buffer = '\r\n'
  74.     buffer += '--%s--\r\n' % boundary
  75.     buffer += '\r\n'
  76.     if sendfunc:
  77.         sendfunc(buffer)
  78.     
  79.     l += len(buffer)
  80.     return l
  81.  
  82.  
  83. def do_request_(self, request):
  84.     host = request.get_host()
  85.     if not host:
  86.         raise URLError('no host given')
  87.     
  88.     data = request.get_data()
  89.     v_files = []
  90.     v_vars = []
  91.     if request.has_data() and not isinstance(data, str):
  92.         if hasattr(data, 'items'):
  93.             data = data.items()
  94.         else:
  95.             
  96.             try:
  97.                 if len(data) and not isinstance(data[0], tuple):
  98.                     raise TypeError
  99.             except TypeError:
  100.                 (_ty, _va, tb) = sys.exc_info()
  101.                 
  102.                 try:
  103.                     raise TypeError, 'not a valid non-string sequence or mapping object: %r' % type(data), tb
  104.                 finally:
  105.                     del tb
  106.  
  107.  
  108.         for k, v in data:
  109.             if hasattr(v, 'read'):
  110.                 v_files.append((k, v))
  111.                 continue
  112.             v_vars.append((k, v))
  113.         
  114.         boundary = mimetools.choose_boundary()
  115.         request.boundary = boundary
  116.         request.v_files = v_files
  117.         request.v_vars = v_vars
  118.     
  119.     if len(v_vars) > 0 and len(v_files) == 0:
  120.         request.data = data = urllib.urlencode(v_vars)
  121.         v_files[:] = []
  122.         v_vars[:] = []
  123.     
  124.     if request.has_data():
  125.         if 'Content-type' not in request.headers:
  126.             if len(v_files) > 0:
  127.                 l = send_data(v_vars, v_files, boundary)
  128.                 request.add_unredirected_header('Content-Type', 'multipart/form-data; boundary=%s' % boundary)
  129.                 request.add_unredirected_header('Content-length', str(l))
  130.             else:
  131.                 request.add_unredirected_header('Content-type', 'application/x-www-form-urlencoded')
  132.                 if 'Content-length' not in request.headers:
  133.                     request.add_unredirected_header('Content-length', '%d' % len(data))
  134.                 
  135.         
  136.     
  137.     (_scheme, sel) = splittype(request.get_selector())
  138.     (sel_host, _sel_path) = splithost(sel)
  139.     if not request.has_header('Host'):
  140.         if not sel_host:
  141.             pass
  142.         request.add_unredirected_header('Host', host)
  143.     
  144.     for name, value in self.parent.addheaders:
  145.         name = name.capitalize()
  146.         if not request.has_header(name):
  147.             request.add_unredirected_header(name, value)
  148.             continue
  149.     
  150.     return request
  151.  
  152. urllib2.AbstractHTTPHandler.do_request_ = do_request_
  153. old_open = urllib2.AbstractHTTPHandler.do_open
  154.  
  155. def do_open(self, http_class, req):
  156.     req = do_request_(self, req)
  157.     host = req.get_host()
  158.     if not host:
  159.         raise URLError('no host given')
  160.     
  161.     h = http_class(host)
  162.     h.set_debuglevel(self._debuglevel)
  163.     headers = dict(req.headers)
  164.     headers.update(req.unredirected_hdrs)
  165.     headers['Connection'] = 'close'
  166.     headers = dict((lambda .0: for name, val in .0:
  167. (name.title(), val))(headers.items()))
  168.     if req.has_data() and not isinstance(req.data, str):
  169.         reqdata = req
  170.     else:
  171.         reqdata = req.data
  172.     
  173.     try:
  174.         h.request(req.get_method(), req.get_selector(), reqdata, headers)
  175.         r = h.getresponse()
  176.     except socket.error:
  177.         err = None
  178.         raise URLError(err)
  179.  
  180.     r.recv = r.read
  181.     fp = socket._fileobject(r, close = True)
  182.     resp = addinfourl(fp, r.msg, req.get_full_url())
  183.     resp.code = r.status
  184.     resp.msg = r.reason
  185.     return resp
  186.  
  187. urllib2.AbstractHTTPHandler.do_open = do_open
  188.  
  189. def _send_request(self, method, url, body, headers):
  190.     header_names = []([ k.lower() for k in headers ])
  191.     skips = { }
  192.     if 'accept-encoding' in header_names:
  193.         skips['skip_accept_encoding'] = 1
  194.     
  195.     self.putrequest(method, url, **skips)
  196.     if isinstance(body, str):
  197.         if body and 'content-length' not in header_names:
  198.             self.putheader('Content-Length', str(len(body)))
  199.         
  200.     
  201.     for hdr, value in headers.iteritems():
  202.         self.putheader(hdr, value)
  203.     
  204.     self.endheaders()
  205.     if body:
  206.         self.send(body)
  207.     
  208.  
  209. httplib.HTTPConnection._send_request = _send_request
  210.  
  211. def send(self, str):
  212.     if self.sock is None:
  213.         if self.auto_open:
  214.             self.connect()
  215.         else:
  216.             raise NotConnected()
  217.     
  218.     if self.debuglevel > 0:
  219.         print 'send:', repr(str)
  220.     
  221.     
  222.     try:
  223.         if hasattr(str, 'boundary'):
  224.             boundary = str.boundary
  225.             v_files = str.v_files
  226.             v_vars = str.v_vars
  227.             send_data(v_vars, v_files, boundary, self.sock.sendall)
  228.         else:
  229.             self.sock.sendall(str)
  230.     except socket.error:
  231.         v = None
  232.         if v[0] == 32:
  233.             self.close()
  234.         
  235.         raise 
  236.  
  237.  
  238. httplib.HTTPConnection.send = send
  239.