def _handle_events(self, fd, events):
"""Called by IOLoop when there is activity on one of our
file descriptors.
"""
action = 0
if events & ioloop.IOLoop.READ:
action |= pycurl.CSELECT_IN
if events & ioloop.IOLoop.WRITE:
action |= pycurl.CSELECT_OUT
while True:
try:
ret, num_handles = self._multi.socket_action(fd, action)
except pycurl.error as e:
ret = e.args[0]
if ret != pycurl.E_CALL_MULTI_PERFORM:
break
self._finish_pending_requests()
python类error()的实例源码
def _handle_events(self, fd, events):
"""Called by IOLoop when there is activity on one of our
file descriptors.
"""
action = 0
if events & ioloop.IOLoop.READ:
action |= pycurl.CSELECT_IN
if events & ioloop.IOLoop.WRITE:
action |= pycurl.CSELECT_OUT
while True:
try:
ret, num_handles = self._multi.socket_action(fd, action)
except pycurl.error as e:
ret = e.args[0]
if ret != pycurl.E_CALL_MULTI_PERFORM:
break
self._finish_pending_requests()
def ipv6_asn(ifname):
try:
c = pycurl.Curl()
body = BytesIO()
c.setopt(c.URL, "https://stat.ripe.net/data/prefix-overview/data.json?resource={}"
.format(ipv6_address_public(ifname)))
c.setopt(c.INTERFACE, ifname)
c.setopt(c.WRITEDATA, body)
c.perform()
asns = json.loads((body.getvalue()).decode('utf-8'))['data']['asns']
if len(asns) == 1:
return asns[0]['asn']
else:
return None
except pycurl.error:
return None
def perform(self):
self.__performHead=""
self.__performBody=""
self.__headersSent=""
try:
conn = Request.to_pycurl_object(pycurl.Curl(), self)
conn.perform()
self.response_from_conn_object(conn, self.__performHead, self.__performBody)
except pycurl.error, error:
errno, errstr = error
raise ReqRespException(ReqRespException.FATAL, errstr)
finally:
conn.close()
######### ESTE conjunto de funciones no es necesario para el uso habitual de la clase
def fetch_many_async(urls, callback=None, errback=None, **kwargs):
"""
Retrieve a list of URLs asynchronously.
@param callback: Optionally, a function that will be fired one time for
each successful URL, and will be passed its content and the URL itself.
@param errback: Optionally, a function that will be fired one time for each
failing URL, and will be passed the failure and the URL itself.
@return: A C{DeferredList} whose callback chain will be fired as soon as
all downloads have terminated. If an error occurs, the errback chain
of the C{DeferredList} will be fired immediatly.
"""
results = []
for url in urls:
result = fetch_async(url, **kwargs)
if callback:
result.addCallback(callback, url)
if errback:
result.addErrback(errback, url)
results.append(result)
return DeferredList(results, fireOnOneErrback=True, consumeErrors=True)
def test_fetch_to_files_with_non_existing_directory(self):
"""
The deferred list returned by L{fetch_to_files} results in a failure
if the destination directory doesn't exist.
"""
url_results = {"http://im/right": b"right"}
directory = "i/dont/exist/"
curl = CurlManyStub(url_results)
result = fetch_to_files(url_results.keys(), directory, curl=curl)
def check_error(failure):
error = str(failure.value.subFailure.value)
self.assertEqual(error,
("[Errno 2] No such file or directory: "
"'i/dont/exist/right'"))
self.assertFalse(os.path.exists(os.path.join(directory, "right")))
result.addErrback(check_error)
return result
def send(self, p_retry = 0):
l_retry = p_retry
while l_retry >= 0:
self.cleanup()
try:
self.m_handle.perform()
self.read_response()
except pycurl.error as l_error:
l_code = l_error.args[0]
if l_code == 28:
logger.warning(__name__, "timeout on request '%s' : %s", self.m_request.m_url, l_error.args[1])
self.m_response.m_error = l_error.args[1]
return False
else:
self.m_response.m_error = "curl error : %s" % self._error_from_core(l_code)
if not self.response().has_error():
return True
logger.info(__name__, "error on request '%s' (left %d retries left) : %s", self.m_request.m_url, l_retry, self.response().m_error)
l_retry -= 1
logger.error(__name__, "error on request '%s' : %s", self.m_request.m_url, self.response().m_error)
return False
curl_httpclient.py 文件源码
项目:My-Web-Server-Framework-With-Python2.7
作者: syjsu
项目源码
文件源码
阅读 16
收藏 0
点赞 0
评论 0
def _handle_events(self, fd, events):
"""Called by IOLoop when there is activity on one of our
file descriptors.
"""
action = 0
if events & ioloop.IOLoop.READ:
action |= pycurl.CSELECT_IN
if events & ioloop.IOLoop.WRITE:
action |= pycurl.CSELECT_OUT
while True:
try:
ret, num_handles = self._multi.socket_action(fd, action)
except pycurl.error as e:
ret = e.args[0]
if ret != pycurl.E_CALL_MULTI_PERFORM:
break
self._finish_pending_requests()
def _attach_stream(self, event):
""" Attach stream to circuit. """
try:
self._controller.attach_stream(event.id, self._cid)
except (OperationFailed, InvalidRequest), error:
error = str(error)
# If circuit is already closed, close stream too.
if error in (('Unknown circuit "%s"' % self._cid),
"Can't attach stream to non-open origin circuit"):
self._controller.close_stream(event.id)
# Ignore the rare cases (~5*10^-7) where a stream has already been
# closed almost directly after its NEW-event has been received.
elif error == 'Unknown stream "%s"' % event.id:
sys.stderr.write('Stream %s has already been ' +
'closed.\n' % event.id)
else:
raise
def perform(self):
self.__performHead=""
self.__performBody=""
self.__headersSent=""
try:
conn = Request.to_pycurl_object(pycurl.Curl(), self)
conn.perform()
self.response_from_conn_object(conn, self.__performHead, self.__performBody)
except pycurl.error, error:
errno, errstr = error
raise ReqRespException(ReqRespException.FATAL, errstr)
finally:
conn.close()
######### ESTE conjunto de funciones no es necesario para el uso habitual de la clase
def fetch(self, request, **kwargs):
"""Executes an HTTPRequest, returning an HTTPResponse.
If an error occurs during the fetch, we raise an HTTPError.
"""
if not isinstance(request, HTTPRequest):
request = HTTPRequest(url=request, **kwargs)
buffer = cStringIO.StringIO()
headers = httputil.HTTPHeaders()
try:
_curl_setup_request(self._curl, request, buffer, headers)
self._curl.perform()
code = self._curl.getinfo(pycurl.HTTP_CODE)
effective_url = self._curl.getinfo(pycurl.EFFECTIVE_URL)
buffer.seek(0)
response = HTTPResponse(
request=request, code=code, headers=headers,
buffer=buffer, effective_url=effective_url)
if code < 200 or code >= 300:
raise HTTPError(code, response=response)
return response
except pycurl.error, e:
buffer.close()
raise CurlError(*e)
def _handle_events(self, fd, events):
"""Called by IOLoop when there is activity on one of our
file descriptors.
"""
action = 0
if events & ioloop.IOLoop.READ:
action |= pycurl.CSELECT_IN
if events & ioloop.IOLoop.WRITE:
action |= pycurl.CSELECT_OUT
while True:
try:
ret, num_handles = self._socket_action(fd, action)
except pycurl.error as e:
ret = e.args[0]
if ret != pycurl.E_CALL_MULTI_PERFORM:
break
self._finish_pending_requests()
def _handle_events(self, fd, events):
"""Called by IOLoop when there is activity on one of our
file descriptors.
"""
action = 0
if events & ioloop.IOLoop.READ:
action |= pycurl.CSELECT_IN
if events & ioloop.IOLoop.WRITE:
action |= pycurl.CSELECT_OUT
while True:
try:
ret, num_handles = self._multi.socket_action(fd, action)
except pycurl.error as e:
ret = e.args[0]
if ret != pycurl.E_CALL_MULTI_PERFORM:
break
self._finish_pending_requests()
def transfer(ipaddr, username, password, commandfile):
#transfers commandfile to camera
storage = StringIO()
c = pycurl.Curl()
c.setopt(c.URL, 'http://' + ipaddr + '/admin/remoteconfig')
c.setopt(c.POST, 1)
c.setopt(c.CONNECTTIMEOUT, 5)
c.setopt(c.TIMEOUT, TIMEOUT)
filesize = os.path.getsize(commandfile)
f = open(commandfile, 'rb')
c.setopt(c.FAILONERROR, True)
c.setopt(pycurl.POSTFIELDSIZE, filesize)
c.setopt(pycurl.READFUNCTION, FileReader(f).read_callback)
c.setopt(c.WRITEFUNCTION, storage.write)
c.setopt(pycurl.HTTPHEADER, ["application/x-www-form-urlencoded"])
c.setopt(c.VERBOSE, VERBOSE)
c.setopt(pycurl.HTTPAUTH, pycurl.HTTPAUTH_BASIC)
c.setopt(pycurl.USERPWD, username + ':' + password)
try:
c.perform()
except pycurl.error, error:
errno, errstr = error
print 'An error occurred: ', errstr
return False, ''
c.close()
content = storage.getvalue()
f.close()
return True, content
# ***************************************************************
# *** Main program ***
# ***************************************************************
def _handle_events(self, fd, events):
"""Called by IOLoop when there is activity on one of our
file descriptors.
"""
action = 0
if events & ioloop.IOLoop.READ:
action |= pycurl.CSELECT_IN
if events & ioloop.IOLoop.WRITE:
action |= pycurl.CSELECT_OUT
while True:
try:
ret, num_handles = self._socket_action(fd, action)
except pycurl.error as e:
ret = e.args[0]
if ret != pycurl.E_CALL_MULTI_PERFORM:
break
self._finish_pending_requests()
def _handle_events(self, fd, events):
"""Called by IOLoop when there is activity on one of our
file descriptors.
"""
action = 0
if events & ioloop.IOLoop.READ:
action |= pycurl.CSELECT_IN
if events & ioloop.IOLoop.WRITE:
action |= pycurl.CSELECT_OUT
while True:
try:
ret, num_handles = self._multi.socket_action(fd, action)
except pycurl.error as e:
ret = e.args[0]
if ret != pycurl.E_CALL_MULTI_PERFORM:
break
self._finish_pending_requests()
def user_init(self, config_file):
"""
Try to load default values from config file
Defaults should be in the form x = y
"""
try:
self._read_config("/etc/" + Config.config)
if self._read_config(config_file):
return True
self._read_config(Config.topdir + "/" + Config.config)
if self.topdir != self.homedir:
self._read_config(Config.homedir + "/" + Config.config)
except ValueError as error:
Msg().err("Error:", error)
sys.exit(1)
self._override_config()
self._verify_config()
def restore(self):
"""Restore container files after FileBind"""
error = False
if not os.path.isdir(self.container_orig_dir):
return True
for f_name in os.listdir(self.container_orig_dir):
orig_file = self.container_orig_dir + "/" + f_name
if not os.path.isfile(orig_file):
continue
cont_file = os.path.basename(f_name).replace('#', '/')
cont_file = self.container_root + "/" + cont_file
if os.path.islink(cont_file):
FileUtil(cont_file).remove()
elif os.path.exists(cont_file):
continue
if not FileUtil(orig_file).rename(cont_file):
Msg().err("Error: restoring binded file:", cont_file)
error = True
if not error:
FileUtil(self.container_orig_dir).remove()
FileUtil(self.container_bind_dir).remove()
def _verify_layer_file(self, structure, layer_id):
"""Verify layer file in repository"""
layer_f = structure["layers"][layer_id]["layer_f"]
if not (os.path.exists(layer_f) and
os.path.islink(layer_f)):
Msg().err("Error: layer data file symbolic link not found",
layer_id)
return False
if not os.path.exists(self.cur_tagdir + "/" +
os.readlink(layer_f)):
Msg().err("Error: layer data file not found")
return False
if not FileUtil(layer_f).verify_tar():
Msg().err("Error: layer file not ok:", layer_f)
return False
match = re.search("/sha256:(\\S+)$", layer_f)
if match:
layer_f_chksum = ChkSUM().sha256(layer_f)
if layer_f_chksum != match.group(1):
Msg().err("Error: layer file chksum error:", layer_f)
return False
return True
def do_load(self, cmdp):
"""
load: load a container image saved by docker with 'docker save'
load --input=<docker-saved-container-file>
load -i <docker-saved-container-file>
load < <docker-saved-container-file>
"""
imagefile = cmdp.get("--input=")
if not imagefile:
imagefile = cmdp.get("-i=")
if imagefile is False:
imagefile = "-"
if cmdp.missing_options(): # syntax error
return False
if not imagefile:
Msg().err("Error: must specify filename of docker exported image")
return False
repos = self.dockerlocalfileapi.load(imagefile)
if not repos:
Msg().err("Error: loading failed")
return False
else:
for repo_item in repos:
Msg().out(repo_item)
return True
def do_create(self, cmdp):
"""
create: extract image layers and create a container
create [options] <repo/image:tag>
--name=xxxx :set or change the name of the container
"""
imagespec = cmdp.get("P1")
name = cmdp.get("--name=")
if cmdp.missing_options(): # syntax error
return False
container_id = self._create(imagespec)
if container_id:
Msg().out(container_id)
if name and not self.localrepo.set_container_name(container_id,
name):
Msg().err("Error: invalid container name may already exist "
"or wrong format")
return False
return True
return False
def do_rmi(self, cmdp):
"""
rmi: delete an image in the local repository
rmi [options] <repo/image:tag>
-f :force removal
"""
force = cmdp.get("-f")
imagespec = str(cmdp.get("P1"))
(imagerepo, tag) = self._check_imagespec(imagespec)
if cmdp.missing_options(): # syntax error
return False
if not imagerepo:
return False
else:
if self.localrepo.isprotected_imagerepo(imagerepo, tag):
Msg().err("Error: image repository is protected")
return False
Msg().out("Info: deleting image:", imagespec, l=Msg.INF)
if not self.localrepo.del_imagerepo(imagerepo, tag, force):
Msg().err("Error: deleting image")
return False
return True
def do_protect(self, cmdp):
"""
protect: protect a container or image against deletion
protect <container-id or repo/image:tag>
"""
arg = cmdp.get("P1")
if cmdp.missing_options(): # syntax error
return False
if self.localrepo.get_container_id(arg):
if not self.localrepo.protect_container(arg):
Msg().err("Error: protect container failed")
return False
return True
else:
(imagerepo, tag) = self._check_imagespec(arg)
if imagerepo:
if self.localrepo.protect_imagerepo(imagerepo, tag):
return True
Msg().err("Error: protect image failed")
return False
def do_unprotect(self, cmdp):
"""
unprotect: remove delete protection
unprotect <container-id or repo/image:tag>
"""
arg = cmdp.get("P1")
if cmdp.missing_options(): # syntax error
return False
if self.localrepo.get_container_id(arg):
if not self.localrepo.unprotect_container(arg):
Msg().err("Error: unprotect container failed")
return False
return True
else:
(imagerepo, tag) = self._check_imagespec(arg)
if imagerepo:
if self.localrepo.unprotect_imagerepo(imagerepo, tag):
return True
Msg().err("Error: unprotect image failed")
return False
def do_name(self, cmdp):
"""
name: give a name alias to a container
name <container-id> <container-name>
"""
container_id = cmdp.get("P1")
name = cmdp.get("P2")
if cmdp.missing_options(): # syntax error
return False
if not (self.localrepo.get_container_id(container_id) and name):
Msg().err("Error: invalid container id or name")
return False
if not self.localrepo.set_container_name(container_id, name):
Msg().err("Error: invalid container name")
return False
return True
def do_verify(self, cmdp):
"""
verify: verify an image
verify <repo/image:tag>
"""
(imagerepo, tag) = self._check_imagespec(cmdp.get("P1"))
if (not imagerepo) or cmdp.missing_options(): # syntax error
return False
else:
Msg().out("Info: verifying: %s:%s" % (imagerepo, tag), l=Msg.INF)
if not self.localrepo.cd_imagerepo(imagerepo, tag):
Msg().err("Error: selecting image and tag")
return False
elif self.localrepo.verify_image():
Msg().out("Info: image Ok", l=Msg.INF)
return True
Msg().err("Error: image verification failure")
return False
def declare_options(self, opts_string, opt_where="CMD_OPT"):
"""Declare in advance options that are part of the command line
"""
pos = 0
opt_list = self._argv_split[opt_where]
while pos < len(opt_list):
for opt_name in opts_string.strip().split():
if opt_name.endswith("="):
if opt_list[pos].startswith(opt_name):
self._argv_consumed_options[opt_where].append(pos)
elif opt_list[pos] == opt_name[:-1]:
self._argv_consumed_options[opt_where].append(pos)
if pos + 1 == len(opt_list):
break # error -x without argument at end of line
if (pos < len(opt_list) and
not opt_list[pos+1].startswith("-")):
self._argv_consumed_options[opt_where].\
append(pos + 1)
elif opt_list[pos] == opt_name:
self._argv_consumed_options[opt_where].append(pos)
pos += 1
def _handle_events(self, fd, events):
"""Called by IOLoop when there is activity on one of our
file descriptors.
"""
action = 0
if events & ioloop.IOLoop.READ:
action |= pycurl.CSELECT_IN
if events & ioloop.IOLoop.WRITE:
action |= pycurl.CSELECT_OUT
while True:
try:
ret, num_handles = self._multi.socket_action(fd, action)
except pycurl.error as e:
ret = e.args[0]
if ret != pycurl.E_CALL_MULTI_PERFORM:
break
self._finish_pending_requests()
def load(self):
parser = ConfigParser()
settings = {}
try:
found = parser.read(AppConfiguration.CONFIG_FNAME)
if found and self.section_name in parser.sections():
settings = parser[self.section_name]
except Exception:
msg = 'Error loading app settings from {}. Error details logged to file.'.format(AppConfiguration.CONFIG_FNAME)
logger.error(msg)
logexception()
raise AppException(msg)
self._load_settings(settings)
self.save()
def onDownloadComplete(self, url, data):
self.requested = False
if not data:
# print('Request Failed: {}'. format(self.result.item.name))
return
if self.image:
return
# CONVERT DATA TO GIF IMAGE
try:
img = PIL.Image.open(data)
self.image = PIL.ImageTk.PhotoImage(img)
self.updateOverlayImage(img)
if url not in self.CACHE:
self.CACHE[url] = data
# notify ui
self.ui_queue.put((MsgType.Object, self))
except OSError as e:
item = self.item
with open('tmp\\{}.err.png'.format(item.name.strip()), mode='wb') as f:
f.write(data.getvalue())
logger.error('Image conversion failed: {}, Length: {}\t{}'.format(item.name, len(data.getvalue()), url))