def request(self, url, query, headers, timeout):        
     request = urllib2.Request(url, query, headers)
     try:
         if (sys.version_info[0] == 2 and sys.version_info[1] > 5) or sys.version_info[0] > 2:
             logger.debug('Using timeout %f s' % (timeout))
             response = urllib2.urlopen(request, timeout=timeout)
         else:
             response = urllib2.urlopen(request)
     except urllib2.HTTPError, error:
         raise HTTPHandlerError(error.filename, error.code, error.msg, dict(error.headers), error.read())
 def _debug_httperror(self, error):
     try:
         data = json.loads(error.data)
     except ValueError:
         data = error.data
     logger.debug(
         json.dumps(
             {
                 'response': {
                     'url': error.url,
                     'code': error.code,
                     'msg': error.message,
                     'headers': error.headers,
                     'data': data,
                 }
             },
             indent=2
         )
     )
 def _http_query(self, query, timeout=None):
     headers = {'x-transmission-session-id': self.session_id}
     request_count = 0
     if timeout == None:
         timeout = self._query_timeout
     while True:
         logger.debug(json.dumps({'url': self.url, 'headers': headers, 'query': query, 'timeout': timeout}, indent=2))
         try:
             result = self.http_handler.request(self.url, query, headers, timeout)
             break
         except HTTPHandlerError, error:
             if error.code == 409:
                 logger.info('Server responded with 409, trying to set session-id.')
                 if request_count > 1:
                     raise TransmissionError('Session ID negotiation failed.', error)
                 if 'x-transmission-session-id' in error.headers:
                     self.session_id = error.headers['x-transmission-session-id']
                     headers = {'x-transmission-session-id': self.session_id}
                 else:
                     raise TransmissionError('Unknown conflict.', error)
             else:
                 raise TransmissionError('Request failed.', error)
             self._debug_httperror(error)
         request_count = request_count + 1
                            , 'arguments': arguments})
        self._sequence += 1
        start = time.time()
        http_data = self._http_query(query, timeout)
        elapsed = time.time() - start
        logger.info('http request took %.3f s' % (elapsed))

        try:
            data = json.loads(http_data)
        except ValueError, e:
            logger.error('Error: ' + str(e))
            logger.error('Request: \"%s\"' % (query))
            logger.error('HTTP data: \"%s\"' % (http_data))
            raise

        logger.debug(json.dumps(data, indent=2))
        if 'result' in data:
            if data['result'] != 'success':
                raise TransmissionError('Query failed with result \"%s\".' % (data['result']))
        else:
            raise TransmissionError('Query failed without result.')

        results = {}
        if method == 'torrent-get':
            for item in data['arguments']['torrents']:
                results[item['id']] = Torrent(item)
                if self.protocol_version == 2 and 'peers' not in item:
                    self.protocol_version = 1
        elif method == 'torrent-add':
            item = data['arguments']['torrent-added']
            results[item['id']] = Torrent(item)