home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 February / maximum-cd-2011-02.iso / DiscContents / digsby_setup85.exe / lib / util / urllib2_file.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-11-24  |  6.2 KB  |  240 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  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.     host
  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.                 not isinstance(data[0], tuple)
  100.             except TypeError:
  101.                 (_ty, _va, tb) = sys.exc_info()
  102.                 
  103.                 try:
  104.                     raise TypeError, 'not a valid non-string sequence or mapping object: %r' % type(data), tb
  105.                 finally:
  106.                     del tb
  107.  
  108.  
  109.         for k, v in data:
  110.             if hasattr(v, 'read'):
  111.                 v_files.append((k, v))
  112.                 continue
  113.             v_vars.append((k, v))
  114.         
  115.         boundary = mimetools.choose_boundary()
  116.         request.boundary = boundary
  117.         request.v_files = v_files
  118.         request.v_vars = v_vars
  119.     
  120.     if len(v_vars) > 0 and len(v_files) == 0:
  121.         request.data = data = urllib.urlencode(v_vars)
  122.         v_files[:] = []
  123.         v_vars[:] = []
  124.     
  125.     if request.has_data():
  126.         if 'Content-type' not in request.headers:
  127.             if len(v_files) > 0:
  128.                 l = send_data(v_vars, v_files, boundary)
  129.                 request.add_unredirected_header('Content-Type', 'multipart/form-data; boundary=%s' % boundary)
  130.                 request.add_unredirected_header('Content-length', str(l))
  131.             else:
  132.                 request.add_unredirected_header('Content-type', 'application/x-www-form-urlencoded')
  133.                 if 'Content-length' not in request.headers:
  134.                     request.add_unredirected_header('Content-length', '%d' % len(data))
  135.                 
  136.         
  137.     
  138.     (_scheme, sel) = splittype(request.get_selector())
  139.     (sel_host, _sel_path) = splithost(sel)
  140.     if not request.has_header('Host'):
  141.         if not sel_host:
  142.             pass
  143.         request.add_unredirected_header('Host', host)
  144.     
  145.     for name, value in self.parent.addheaders:
  146.         name = name.capitalize()
  147.         if not request.has_header(name):
  148.             request.add_unredirected_header(name, value)
  149.             continue
  150.     
  151.     return request
  152.  
  153. urllib2.AbstractHTTPHandler.do_request_ = do_request_
  154. old_open = urllib2.AbstractHTTPHandler.do_open
  155.  
  156. def do_open(self, http_class, req):
  157.     req = do_request_(self, req)
  158.     host = req.get_host()
  159.     if not host:
  160.         raise URLError('no host given')
  161.     host
  162.     h = http_class(host)
  163.     h.set_debuglevel(self._debuglevel)
  164.     headers = dict(req.headers)
  165.     headers.update(req.unredirected_hdrs)
  166.     headers['Connection'] = 'close'
  167.     headers = dict((lambda .0: for name, val in .0:
  168. (name.title(), val))(headers.items()))
  169.     if req.has_data() and not isinstance(req.data, str):
  170.         reqdata = req
  171.     else:
  172.         reqdata = req.data
  173.     
  174.     try:
  175.         h.request(req.get_method(), req.get_selector(), reqdata, headers)
  176.         r = h.getresponse()
  177.     except socket.error:
  178.         err = None
  179.         raise URLError(err)
  180.  
  181.     r.recv = r.read
  182.     fp = socket._fileobject(r, close = True)
  183.     resp = addinfourl(fp, r.msg, req.get_full_url())
  184.     resp.code = r.status
  185.     resp.msg = r.reason
  186.     return resp
  187.  
  188. urllib2.AbstractHTTPHandler.do_open = do_open
  189.  
  190. def _send_request(self, method, url, body, headers):
  191.     header_names = []([ k.lower() for k in headers ])
  192.     skips = { }
  193.     if 'accept-encoding' in header_names:
  194.         skips['skip_accept_encoding'] = 1
  195.     
  196.     self.putrequest(method, url, **skips)
  197.     if isinstance(body, str):
  198.         if body and 'content-length' not in header_names:
  199.             self.putheader('Content-Length', str(len(body)))
  200.         
  201.     
  202.     for hdr, value in headers.iteritems():
  203.         self.putheader(hdr, value)
  204.     
  205.     self.endheaders()
  206.     if body:
  207.         self.send(body)
  208.     
  209.  
  210. httplib.HTTPConnection._send_request = _send_request
  211.  
  212. def send(self, str):
  213.     if self.sock is None:
  214.         if self.auto_open:
  215.             self.connect()
  216.         else:
  217.             raise NotConnected()
  218.     self.auto_open
  219.     if self.debuglevel > 0:
  220.         print 'send:', repr(str)
  221.     
  222.     
  223.     try:
  224.         if hasattr(str, 'boundary'):
  225.             boundary = str.boundary
  226.             v_files = str.v_files
  227.             v_vars = str.v_vars
  228.             send_data(v_vars, v_files, boundary, self.sock.sendall)
  229.         else:
  230.             self.sock.sendall(str)
  231.     except socket.error:
  232.         v = None
  233.         if v[0] == 32:
  234.             self.close()
  235.         
  236.         raise 
  237.  
  238.  
  239. httplib.HTTPConnection.send = send
  240.