mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-24 21:04:40 +01:00
dependencies update
This commit is contained in:
parent
95c9c2bc9b
commit
f310747098
29 changed files with 1087 additions and 1565 deletions
|
|
@ -68,12 +68,24 @@ def uninstall():
|
|||
|
||||
|
||||
def pico_server_launch():
|
||||
# path = "C:/Users/hubert/CODE/github/pico/examples/everything"
|
||||
path = os.path.join(
|
||||
os.path.dirname(__file__),
|
||||
# "package"
|
||||
)
|
||||
|
||||
os.chdir(path)
|
||||
print(os.getcwd())
|
||||
print(os.listdir(path))
|
||||
try:
|
||||
args = [sys.executable, "-m", "pico.server", "pipeline"]
|
||||
args = [sys.executable, "-m", "pico.server",
|
||||
# "pipeline",
|
||||
"api"
|
||||
]
|
||||
|
||||
app.forward(
|
||||
args,
|
||||
cwd=os.path.dirname(__file__)
|
||||
cwd=path
|
||||
)
|
||||
except Exception as e:
|
||||
log.error(e)
|
||||
|
|
|
|||
144
pype/aport/api.py
Normal file
144
pype/aport/api.py
Normal file
|
|
@ -0,0 +1,144 @@
|
|||
# api.py
|
||||
import os
|
||||
import sys
|
||||
import tempfile
|
||||
|
||||
import pico
|
||||
from pico import PicoApp
|
||||
from pico.decorators import request_args, set_cookie, delete_cookie, stream
|
||||
from pico.decorators import header, cookie
|
||||
|
||||
from werkzeug.exceptions import Unauthorized, ImATeapot, BadRequest
|
||||
|
||||
from avalon import api as avalon
|
||||
from avalon import io
|
||||
|
||||
import pyblish.api as pyblish
|
||||
|
||||
from app.api import forward
|
||||
from pype import api as pype
|
||||
|
||||
|
||||
log = pype.Logger.getLogger(__name__, "aport")
|
||||
|
||||
|
||||
SESSION = avalon.session
|
||||
if not SESSION:
|
||||
io.install()
|
||||
|
||||
|
||||
@pico.expose()
|
||||
def publish(json_data_path, gui):
|
||||
"""
|
||||
Runs standalone pyblish and adds link to
|
||||
data in external json file
|
||||
|
||||
It is necessary to run `register_plugin_path` if particular
|
||||
host is needed
|
||||
|
||||
Args:
|
||||
json_data_path (string): path to temp json file with
|
||||
context data
|
||||
staging_dir (strign, optional): path to temp directory
|
||||
|
||||
Returns:
|
||||
dict: return_json_path
|
||||
|
||||
Raises:
|
||||
Exception: description
|
||||
|
||||
"""
|
||||
cwd = os.getenv('AVALON_WORKDIR').replace("\\", "/")
|
||||
|
||||
staging_dir = tempfile.mkdtemp(prefix="pype_aport_").replace("\\", "/")
|
||||
log.info("staging_dir: {}".format(staging_dir))
|
||||
return_json_path = os.path.join(staging_dir, "return_data.json").replace("\\", "/")
|
||||
|
||||
log.info("avalon.session is: \n{}".format(SESSION))
|
||||
|
||||
pype_start = os.path.join(os.getenv('PYPE_SETUP_ROOT'),
|
||||
"app", "pype-start.py")
|
||||
|
||||
publish = "--publish-gui" if gui else "--publish"
|
||||
|
||||
args = [pype_start, publish,
|
||||
"-pp", os.environ["PUBLISH_PATH"],
|
||||
"-d", "rqst_json_data_path", json_data_path,
|
||||
"-d", "post_json_data_path", return_json_path
|
||||
]
|
||||
|
||||
log.debug(args)
|
||||
|
||||
# start standalone pyblish qml
|
||||
forward([
|
||||
sys.executable, "-u"
|
||||
] + args,
|
||||
cwd=cwd
|
||||
)
|
||||
|
||||
return {"return_json_path": return_json_path}
|
||||
|
||||
|
||||
@pico.expose()
|
||||
def context(project, asset, task, app):
|
||||
# http://localhost:4242/pipeline/context?project=this&asset=shot01&task=comp
|
||||
|
||||
os.environ["AVALON_PROJECT"] = project
|
||||
|
||||
avalon.update_current_task(task, asset, app)
|
||||
|
||||
project_code = pype.get_project_code()
|
||||
pype.set_project_code(project_code)
|
||||
hierarchy = pype.get_hierarchy()
|
||||
pype.set_hierarchy(hierarchy)
|
||||
fix_paths = {k: v.replace("\\", "/") for k, v in SESSION.items()
|
||||
if isinstance(v, str)}
|
||||
SESSION.update(fix_paths)
|
||||
SESSION.update({"AVALON_HIERARCHY": hierarchy,
|
||||
"AVALON_PROJECTCODE": project_code,
|
||||
"current_dir": os.getcwd().replace("\\", "/")
|
||||
})
|
||||
|
||||
return SESSION
|
||||
|
||||
|
||||
@pico.expose()
|
||||
def deregister_plugin_path():
|
||||
if os.getenv("PUBLISH_PATH", None):
|
||||
aport_plugin_path = [p.replace("\\", "/") for p in os.environ["PUBLISH_PATH"].split(
|
||||
os.pathsep) if "aport" in p][0]
|
||||
os.environ["PUBLISH_PATH"] = aport_plugin_path
|
||||
else:
|
||||
log.warning("deregister_plugin_path(): No PUBLISH_PATH is registred")
|
||||
|
||||
return "Publish path deregistered"
|
||||
|
||||
|
||||
@pico.expose()
|
||||
def register_plugin_path(publish_path):
|
||||
deregister_plugin_path()
|
||||
if os.getenv("PUBLISH_PATH", None):
|
||||
os.environ["PUBLISH_PATH"] = os.pathsep.join(
|
||||
os.environ["PUBLISH_PATH"].split(os.pathsep) +
|
||||
[publish_path.replace("\\", "/")]
|
||||
)
|
||||
else:
|
||||
os.environ["PUBLISH_PATH"] = publish_path
|
||||
|
||||
log.info(os.environ["PUBLISH_PATH"].split(os.pathsep))
|
||||
|
||||
return "Publish registered paths: {}".format(
|
||||
os.environ["PUBLISH_PATH"].split(os.pathsep)
|
||||
)
|
||||
|
||||
|
||||
app = PicoApp()
|
||||
app.register_module(__name__)
|
||||
|
||||
# remove all Handlers created by pico
|
||||
for name, handler in [(handler.get_name(), handler)
|
||||
for handler in pype.Logger.logging.root.handlers[:]]:
|
||||
if "pype" not in str(name).lower():
|
||||
print(name)
|
||||
print(handler)
|
||||
pype.Logger.logging.root.removeHandler(handler)
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,19 +0,0 @@
|
|||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head>
|
||||
<title>Pico Example</title>
|
||||
<!-- Load the pico Javascript client, always automatically available at /pico.js -->
|
||||
<script src="/pico.js"></script>
|
||||
<!-- Load our example module -->
|
||||
<script src="/example.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<p id="message"></p>
|
||||
<script>
|
||||
var pipeline = pico.importModule('pipeline')
|
||||
pipeline.context("Fergal").then(function(response){
|
||||
document.getElementById('message').innerHTML = response;
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
246
pype/aport/original/api.py
Normal file
246
pype/aport/original/api.py
Normal file
|
|
@ -0,0 +1,246 @@
|
|||
# api.py
|
||||
import os
|
||||
import sys
|
||||
import tempfile
|
||||
|
||||
import pico
|
||||
from pico import PicoApp
|
||||
from pico.decorators import request_args, set_cookie, delete_cookie, stream
|
||||
from pico.decorators import header, cookie
|
||||
|
||||
from werkzeug.exceptions import Unauthorized, ImATeapot, BadRequest
|
||||
|
||||
from avalon import api as avalon
|
||||
from avalon import io
|
||||
|
||||
import pyblish.api as pyblish
|
||||
|
||||
from app.api import forward
|
||||
from pype import api as pype
|
||||
|
||||
|
||||
log = pype.Logger.getLogger(__name__, "aport")
|
||||
|
||||
|
||||
SESSION = avalon.session
|
||||
if not SESSION:
|
||||
io.install()
|
||||
|
||||
|
||||
@pico.expose()
|
||||
def publish(json_data_path, staging_dir=None):
|
||||
"""
|
||||
Runs standalone pyblish and adds link to
|
||||
data in external json file
|
||||
|
||||
It is necessary to run `register_plugin_path` if particular
|
||||
host is needed
|
||||
|
||||
Args:
|
||||
json_data_path (string): path to temp json file with
|
||||
context data
|
||||
staging_dir (strign, optional): path to temp directory
|
||||
|
||||
Returns:
|
||||
dict: return_json_path
|
||||
|
||||
Raises:
|
||||
Exception: description
|
||||
|
||||
"""
|
||||
cwd = os.getenv('AVALON_WORKDIR').replace("\\", "/")
|
||||
os.chdir(cwd)
|
||||
log.info(os.getcwd())
|
||||
staging_dir = tempfile.mkdtemp(prefix="pype_aport_").replace("\\", "/")
|
||||
log.info("staging_dir: {}".format(staging_dir))
|
||||
return_json_path = os.path.join(staging_dir, "return_data.json")
|
||||
|
||||
log.info("avalon.session is: \n{}".format(SESSION))
|
||||
pype_start = os.path.join(os.getenv('PYPE_SETUP_ROOT'),
|
||||
"app", "pype-start.py")
|
||||
|
||||
args = [pype_start, "--publish",
|
||||
"-pp", os.environ["PUBLISH_PATH"],
|
||||
"-d", "rqst_json_data_path", json_data_path,
|
||||
"-d", "post_json_data_path", return_json_path
|
||||
]
|
||||
|
||||
log.debug(args)
|
||||
|
||||
# start standalone pyblish qml
|
||||
forward([
|
||||
sys.executable, "-u"
|
||||
] + args,
|
||||
cwd=cwd
|
||||
)
|
||||
|
||||
return {"return_json_path": return_json_path}
|
||||
|
||||
|
||||
@pico.expose()
|
||||
def context(project, asset, task, app):
|
||||
# http://localhost:4242/pipeline/context?project=this&asset=shot01&task=comp
|
||||
|
||||
os.environ["AVALON_PROJECT"] = project
|
||||
|
||||
avalon.update_current_task(task, asset, app)
|
||||
|
||||
project_code = pype.get_project_code()
|
||||
pype.set_project_code(project_code)
|
||||
hierarchy = pype.get_hierarchy()
|
||||
pype.set_hierarchy(hierarchy)
|
||||
fix_paths = {k: v.replace("\\", "/") for k, v in SESSION.items()
|
||||
if isinstance(v, str)}
|
||||
SESSION.update(fix_paths)
|
||||
SESSION.update({"AVALON_HIERARCHY": hierarchy,
|
||||
"AVALON_PROJECTCODE": project_code,
|
||||
"current_dir": os.getcwd().replace("\\", "/")
|
||||
})
|
||||
|
||||
return SESSION
|
||||
|
||||
|
||||
@pico.expose()
|
||||
def deregister_plugin_path():
|
||||
if os.getenv("PUBLISH_PATH", None):
|
||||
aport_plugin_path = [p.replace("\\", "/") for p in os.environ["PUBLISH_PATH"].split(
|
||||
os.pathsep) if "aport" in p][0]
|
||||
os.environ["PUBLISH_PATH"] = aport_plugin_path
|
||||
else:
|
||||
log.warning("deregister_plugin_path(): No PUBLISH_PATH is registred")
|
||||
|
||||
return "Publish path deregistered"
|
||||
|
||||
|
||||
@pico.expose()
|
||||
def register_plugin_path(publish_path):
|
||||
deregister_plugin_path()
|
||||
if os.getenv("PUBLISH_PATH", None):
|
||||
os.environ["PUBLISH_PATH"] = os.pathsep.join(
|
||||
os.environ["PUBLISH_PATH"].split(os.pathsep) +
|
||||
[publish_path.replace("\\", "/")]
|
||||
)
|
||||
else:
|
||||
os.environ["PUBLISH_PATH"] = publish_path
|
||||
|
||||
log.info(os.environ["PUBLISH_PATH"].split(os.pathsep))
|
||||
|
||||
return "Publish registered paths: {}".format(
|
||||
os.environ["PUBLISH_PATH"].split(os.pathsep)
|
||||
)
|
||||
|
||||
|
||||
@pico.expose()
|
||||
def nuke_test():
|
||||
import nuke
|
||||
n = nuke.createNode("Constant")
|
||||
log.info(n)
|
||||
|
||||
|
||||
@pico.expose()
|
||||
def hello(who='world'):
|
||||
return 'Hello %s' % who
|
||||
|
||||
|
||||
@pico.expose()
|
||||
def multiply(x, y):
|
||||
return x * y
|
||||
|
||||
|
||||
@pico.expose()
|
||||
def fail():
|
||||
raise Exception('fail!')
|
||||
|
||||
|
||||
@pico.expose()
|
||||
def make_coffee():
|
||||
raise ImATeapot()
|
||||
|
||||
|
||||
@pico.expose()
|
||||
def upload(upload, filename):
|
||||
if not filename.endswith('.txt'):
|
||||
raise BadRequest('Upload must be a .txt file!')
|
||||
return upload.read().decode()
|
||||
|
||||
|
||||
@pico.expose()
|
||||
@request_args(ip='remote_addr')
|
||||
def my_ip(ip):
|
||||
return ip
|
||||
|
||||
|
||||
@pico.expose()
|
||||
@request_args(ip=lambda req: req.remote_addr)
|
||||
def my_ip3(ip):
|
||||
return ip
|
||||
|
||||
|
||||
@pico.prehandle()
|
||||
def set_user(request, kwargs):
|
||||
if request.authorization:
|
||||
if request.authorization.password != 'secret':
|
||||
raise Unauthorized('Incorrect username or password')
|
||||
request.user = request.authorization.username
|
||||
else:
|
||||
request.user = None
|
||||
|
||||
|
||||
@pico.expose()
|
||||
@request_args(username='user')
|
||||
def current_user(username):
|
||||
return username
|
||||
|
||||
|
||||
@pico.expose()
|
||||
@request_args(session=cookie('session_id'))
|
||||
def session_id(session):
|
||||
return session
|
||||
|
||||
|
||||
@pico.expose()
|
||||
@set_cookie()
|
||||
def start_session():
|
||||
return {'session_id': '42'}
|
||||
|
||||
|
||||
@pico.expose()
|
||||
@delete_cookie('session_id')
|
||||
def end_session():
|
||||
return True
|
||||
|
||||
|
||||
@pico.expose()
|
||||
@request_args(session=header('x-session-id'))
|
||||
def session_id2(session):
|
||||
return session
|
||||
|
||||
|
||||
@pico.expose()
|
||||
@stream()
|
||||
def countdown(n=10):
|
||||
for i in reversed(range(n)):
|
||||
yield '%i' % i
|
||||
time.sleep(0.5)
|
||||
|
||||
|
||||
@pico.expose()
|
||||
def user_description(user):
|
||||
return '{name} is a {occupation} aged {age}'.format(**user)
|
||||
|
||||
|
||||
@pico.expose()
|
||||
def show_source():
|
||||
return open(__file__.replace('.pyc', '.py')).read()
|
||||
|
||||
|
||||
app = PicoApp()
|
||||
app.register_module(__name__)
|
||||
|
||||
# remove all Handlers created by pico
|
||||
for name, handler in [(handler.get_name(), handler)
|
||||
for handler in pype.Logger.logging.root.handlers[:]]:
|
||||
if "pype" not in str(name).lower():
|
||||
print(name)
|
||||
print(handler)
|
||||
pype.Logger.logging.root.removeHandler(handler)
|
||||
196
pype/aport/original/index.html
Normal file
196
pype/aport/original/index.html
Normal file
|
|
@ -0,0 +1,196 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Pico Example - Everything</title>
|
||||
<!-- Load the pico Javascript client, always automatically available at /pico.js -->
|
||||
<script src="/pico.js"></script>
|
||||
<!-- Or load our module proxy -->
|
||||
<script src="/api.js"></script>
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
|
||||
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous">
|
||||
|
||||
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.6.0/styles/default.min.css">
|
||||
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.6.0/highlight.min.js"></script>
|
||||
<script></script>
|
||||
|
||||
<style type="text/css">
|
||||
html, body {
|
||||
height: 100%;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
div {
|
||||
padding: 5px;
|
||||
}
|
||||
#container {
|
||||
height: 100%;
|
||||
}
|
||||
#header {
|
||||
height: 5%;
|
||||
}
|
||||
#main {
|
||||
height: 70%;
|
||||
}
|
||||
#output {
|
||||
background-color: #333;
|
||||
color: #aaa;
|
||||
min-height: 15%;
|
||||
overflow-y: scroll;
|
||||
padding: 20px;
|
||||
position: fixed;
|
||||
bottom: 0px;
|
||||
width: 100%;
|
||||
}
|
||||
.error {
|
||||
color: #f00 !important;
|
||||
}
|
||||
#examples li{
|
||||
padding: 10px;
|
||||
margin: 10px;
|
||||
background-color: silver;
|
||||
}
|
||||
code {
|
||||
border-radius: 0;*/
|
||||
margin: 5px;
|
||||
white-space: pre !important;
|
||||
}
|
||||
#source {
|
||||
height: 100%;
|
||||
}
|
||||
#examples {
|
||||
height: 100%;
|
||||
}
|
||||
#spacer {
|
||||
height: 20%;
|
||||
}
|
||||
|
||||
.highlight {
|
||||
background-color: yellow;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="container">
|
||||
<div class="row row-eq-height">
|
||||
<div class="col-md-12">
|
||||
<h1>Pico Examples</h1>
|
||||
<p>Here we show some simple examples of using Pico. Click any <code>api.X</code> link to see the corresponding Python source.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row row-eq-height" id="main">
|
||||
<div class="col-md-6" id="examples">
|
||||
<ol>
|
||||
|
||||
<li id="example1">
|
||||
<h4>Hello World</h4>
|
||||
<pre><code class="js"></code></pre>
|
||||
Name: <input type="text" name="name" value="Bob"/>
|
||||
<button class="btn btn-default btn-sm" type="button" onclick="example1()">Submit</button>
|
||||
</li>
|
||||
<li id="deregister">
|
||||
<h4>deregister_plugin_path</h4>
|
||||
<pre><code class="js"></code></pre>
|
||||
<button class="btn btn-default btn-sm" type="button" onclick="deregister()">Deregister</button>
|
||||
</li>
|
||||
<li id="register">
|
||||
<h4>register_plugin_path</h4>
|
||||
<pre><code class="js"></code></pre>
|
||||
Path: <input type="text" name="path" value="C:/Users/hubert/CODE/pype-setup/repos/pype-config/pype/plugins/premiere/publish"/>
|
||||
<button class="btn btn-default btn-sm" type="button" onclick="register()">Register path</button>
|
||||
</li>
|
||||
<li id="example2">
|
||||
<h4>Numeric Multiplication</h4>
|
||||
<pre><code class="js"></code></pre>
|
||||
<input type="number" name="x" value="6"/> x <input type="number" name="y" value="7"/>
|
||||
<button class="btn btn-default btn-sm" type="button" onclick="example2()">Multiply</button>
|
||||
</li>
|
||||
<li id="example3">
|
||||
<h4>File Upload</h4>
|
||||
<pre><code class="js"></code></pre>
|
||||
<input type="file" name="upload"/>
|
||||
<button class="btn btn-default btn-sm" type="button" onclick="example3()">Upload</button>
|
||||
</li>
|
||||
<li id="example4">
|
||||
<h4>Request parameters (IP address)</h4>
|
||||
<pre><code class="js"></code></pre>
|
||||
<button class="btn btn-default btn-sm" type="button" onclick="example4()">What's my IP?</button>
|
||||
</li>
|
||||
<li id="example5">
|
||||
<h4>Authentication</h4>
|
||||
<pre><code class="js"></code></pre>
|
||||
<p class="bg-info">Note: see <a href="#set_user" onclick="jumpTo('set_user')">api.set_user</a> for the authentication handler.</p>
|
||||
Username: <input type="text" name="username" value="bob"/>
|
||||
Password: <input type="password" name="password" value="secret"/>
|
||||
<button class="btn btn-default btn-sm" type="button" onclick="example5()">Sign In</button>
|
||||
</li>
|
||||
<li id="example6">
|
||||
<h4>Sessions (cookies)</h4>
|
||||
<pre><code class="js"></code></pre>
|
||||
<button class="btn btn-default btn-sm" type="button" onclick="example6()">What's my session id?</button>
|
||||
</li>
|
||||
<li id="example7">
|
||||
<h4>Sessions (header)</h4>
|
||||
<pre><code class="js"></code></pre>
|
||||
<button class="btn btn-default btn-sm" type="button" onclick="example7()">What's my session id?</button>
|
||||
</li>
|
||||
<li id="example8">
|
||||
<h4>Streaming Response</h4>
|
||||
<pre><code class="js"></code></pre>
|
||||
<button class="btn btn-default btn-sm" type="button" onclick="example8()">Countdown</button>
|
||||
</li>
|
||||
<li id="example9">
|
||||
<h4>Objects</h4>
|
||||
<pre><code class="js"></code></pre>
|
||||
<button class="btn btn-default btn-sm" type="button" onclick="example9()">Submit</button>
|
||||
</li>
|
||||
<li id="example10">
|
||||
<h4>Errors</h4>
|
||||
<pre><code class="js"></code></pre>
|
||||
<button class="btn btn-default btn-sm" type="button" onclick="example10()">Submit</button>
|
||||
</li>
|
||||
<li id="example11">
|
||||
<h4>Errors</h4>
|
||||
<pre><code class="js"></code></pre>
|
||||
<button class="btn btn-default btn-sm" type="button" onclick="example11()">Submit</button>
|
||||
</li>
|
||||
<li id="example12">
|
||||
<h4>Forms</h4>
|
||||
<p>This example submits a form as a whole instead of individual arguments.
|
||||
The form input names must match the function argument names.
|
||||
</p>
|
||||
<pre><code class="html"></code></pre>
|
||||
<pre><code class="js"></code></pre>
|
||||
<div class="example">
|
||||
<form>
|
||||
x: <input type="number" name="x" value="6"/><br/>
|
||||
y: <input type="number" name="y" value="7"/>
|
||||
</form>
|
||||
<button class="btn btn-default btn-sm" type="button" onclick="example12()">Multiply</button>
|
||||
</div>
|
||||
</li>
|
||||
<li id="example13">
|
||||
<h4>JSON</h4>
|
||||
<p>This example submits data as JSON instead of individual arguments.
|
||||
The object keys must match the function argument names.
|
||||
</p>
|
||||
<pre><code class="js"></code></pre>
|
||||
<button class="btn btn-default btn-sm" type="button" onclick="example13()">Multiply</button>
|
||||
</li>
|
||||
</ol>
|
||||
<div id="spacer">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6" id="source">
|
||||
<pre><code class="python"></code></pre>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row" id="output">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="script.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
121
pype/aport/static/index.html
Normal file
121
pype/aport/static/index.html
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Pype extention</title>
|
||||
<!-- Load the pico Javascript client, always automatically available at /pico.js -->
|
||||
<script src="/pico.js"></script>
|
||||
<!-- Or load our module proxy -->
|
||||
<script src="/api.js"></script>
|
||||
<!-- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
|
||||
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous">
|
||||
|
||||
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.6.0/styles/default.min.css">
|
||||
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.6.0/highlight.min.js"></script>
|
||||
<script></script> -->
|
||||
|
||||
<style type="text/css">
|
||||
html, body {
|
||||
height: 100%;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
div {
|
||||
padding: 5px;
|
||||
}
|
||||
#container {
|
||||
height: 100%;
|
||||
}
|
||||
#header {
|
||||
height: 5%;
|
||||
}
|
||||
#main {
|
||||
height: 70%;
|
||||
}
|
||||
#output {
|
||||
background-color: #333;
|
||||
color: #aaa;
|
||||
min-height: 15%;
|
||||
overflow-y: scroll;
|
||||
padding: 20px;
|
||||
position: fixed;
|
||||
bottom: 0px;
|
||||
width: 100%;
|
||||
}
|
||||
.error {
|
||||
color: #f00 !important;
|
||||
}
|
||||
#examples li{
|
||||
padding: 10px;
|
||||
margin: 10px;
|
||||
background-color: silver;
|
||||
}
|
||||
code {
|
||||
border-radius: 0;*/
|
||||
margin: 5px;
|
||||
white-space: pre !important;
|
||||
}
|
||||
#source {
|
||||
height: 100%;
|
||||
}
|
||||
#examples {
|
||||
height: 100%;
|
||||
}
|
||||
#spacer {
|
||||
height: 20%;
|
||||
}
|
||||
|
||||
.highlight {
|
||||
background-color: yellow;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="container">
|
||||
<div class="row row-eq-height" id="main">
|
||||
<div class="col-md-6" id="examples">
|
||||
<ol>
|
||||
<li id="context">
|
||||
<h4>Set context</h4>
|
||||
<pre><code class="js"></code></pre>
|
||||
Project<input type="text" name="project" value="jakub_projectx"/>Asset<input type="text" name="asset" value="shot01"/>task<input type="text" name="task" value="compositing"/>app<input type="text" name="app" value="premiera"/>
|
||||
<button class="btn btn-default btn-sm" type="button" onclick="context()">Set context</button>
|
||||
</li>
|
||||
<li id="deregister">
|
||||
<h4>deregister_plugin_path</h4>
|
||||
<pre><code class="js"></code></pre>
|
||||
<button class="btn btn-default btn-sm" type="button"onclick="deregister()">Deregister</button>
|
||||
</li>
|
||||
<li id="register">
|
||||
<h4>register_plugin_path</h4>
|
||||
<pre><code class="js"></code></pre>
|
||||
Path: <input type="text" name="path" value="C:/Users/hubertCODE/pype-setup/repos/pype-config/pype/plugins/premiere/publish"/>
|
||||
<button class="btn btn-default btn-sm" type="button"onclick="register()">Register path</button>
|
||||
</li>
|
||||
<li id="publish">
|
||||
<h4>Publish</h4>
|
||||
<pre><code class="js"></code></pre>
|
||||
Json path: <input type="text" name="path" value="C:/Users/hubert/CODE/pype-setup/repos/pype-config/pype/premiere/example_publish_reqst.json"/>
|
||||
Gui<input type="checkbox" name="gui" value="True" checked>
|
||||
<button class="btn btn-default btn-sm" type="button" onclick="publish()">Publish</button>
|
||||
</li>
|
||||
|
||||
</ol>
|
||||
<div id="spacer">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6" id="source">
|
||||
<!-- <pre>
|
||||
<code class="python"></code>
|
||||
</pre> -->
|
||||
</div>
|
||||
</div>
|
||||
<div class="row" id="output">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="script.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
214
pype/aport/static/script.js
Normal file
214
pype/aport/static/script.js
Normal file
|
|
@ -0,0 +1,214 @@
|
|||
var api = pico.importModule('api');
|
||||
|
||||
var output = document.getElementById('output');
|
||||
|
||||
function querySelector(parent){
|
||||
return function(child){
|
||||
return document.querySelector(parent).querySelector(child)
|
||||
};
|
||||
}
|
||||
|
||||
var defs = {}
|
||||
function jumpTo(name){
|
||||
var e = defs[name];
|
||||
document.querySelectorAll('.highlight').forEach(function(el){
|
||||
el.classList.remove('highlight');
|
||||
});
|
||||
e.classList.add('highlight');
|
||||
return false;
|
||||
}
|
||||
|
||||
function displayResult(r){
|
||||
output.classList.remove("error");
|
||||
output.innerText = JSON.stringify(r);
|
||||
}
|
||||
|
||||
function displayError(e){
|
||||
output.classList.add("error");
|
||||
output.innerText = e.message;
|
||||
}
|
||||
|
||||
function unindent(code){
|
||||
var lines = code.split('\n');
|
||||
var margin = -1;
|
||||
for(var j=0; j < lines.length; j++){
|
||||
var l = lines[j];
|
||||
for(i=0; i < l.length; i++){
|
||||
if(l[i] != " "){
|
||||
margin = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(margin > -1){
|
||||
break;
|
||||
}
|
||||
}
|
||||
lines = lines.slice(j);
|
||||
return lines.map(function(s){ return s.substr(margin)}).join('\n');
|
||||
}
|
||||
|
||||
function deregister(){
|
||||
var $ = querySelector("#deregister");
|
||||
api.deregister_plugin_path().then(displayResult);
|
||||
}
|
||||
|
||||
function register(){
|
||||
var $ = querySelector("#register");
|
||||
var path = $("input[name=path]").value;
|
||||
api.register_plugin_path(path).then(displayResult);
|
||||
}
|
||||
|
||||
|
||||
function publish(){
|
||||
var $ = querySelector("#publish");
|
||||
var path = $("input[name=path]").value;
|
||||
var gui = $("input[name=gui]").checked;
|
||||
api.publish(path, gui).then(displayResult);
|
||||
}
|
||||
|
||||
function context(){
|
||||
var $ = querySelector("#context");
|
||||
var project = $("input[name=project]").value;
|
||||
var asset = $("input[name=asset]").value;
|
||||
var task = $("input[name=task]").value;
|
||||
var app = $("input[name=app]").value;
|
||||
api.context(project,asset,task,app).then(displayResult);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// function example1(){
|
||||
// var $ = querySelector("#example1");
|
||||
// var name = $("input[name=name]").value;
|
||||
// api.hello(name).then(displayResult);
|
||||
// }
|
||||
//
|
||||
//
|
||||
// function example2(){
|
||||
// var $ = querySelector("#example2");
|
||||
// var x = $("input[name=x]").valueAsNumber;
|
||||
// var y = $("#example2 input[name=y]").valueAsNumber;
|
||||
// api.multiply(x, y).then(displayResult);
|
||||
// }
|
||||
//
|
||||
// function example3(){
|
||||
// var $ = querySelector("#example3");
|
||||
// var file = $("input[name=upload]").files[0];
|
||||
// api.upload(file, file.name).then(displayResult).catch(displayError);
|
||||
// }
|
||||
//
|
||||
// function example4(){
|
||||
// var $ = querySelector("#example4");
|
||||
// api.my_ip().then(displayResult)
|
||||
// }
|
||||
//
|
||||
// function example5(){
|
||||
// var $ = querySelector("#example5");
|
||||
// var username = $("input[name=username]").value;
|
||||
// var password = $("input[name=password]").value;
|
||||
// pico.setAuthentication(api, username, password);
|
||||
// api.current_user().then(displayResult).catch(displayError);
|
||||
// pico.clearAuthentication(api);
|
||||
// }
|
||||
//
|
||||
// function example6(){
|
||||
// var $ = querySelector("#example6");
|
||||
// api.start_session().then(function(){
|
||||
// api.session_id().then(displayResult).then(function(){
|
||||
// api.end_session();
|
||||
// })
|
||||
// })
|
||||
// }
|
||||
//
|
||||
// function example7(){
|
||||
// var $ = querySelector("#example7");
|
||||
// var session_id = "4242";
|
||||
// pico.setRequestHook(api, 'session', function(req) {
|
||||
// req.headers.set('X-SESSION-ID', session_id)
|
||||
// })
|
||||
// api.session_id2().then(displayResult)
|
||||
// pico.clearRequestHook(api, 'session');
|
||||
// }
|
||||
//
|
||||
// function example8(){
|
||||
// var $ = querySelector("#example8");
|
||||
// api.countdown(10).each(displayResult).then(function(){
|
||||
// displayResult("Boom!");
|
||||
// });
|
||||
// }
|
||||
//
|
||||
// function example9(){
|
||||
// var $ = querySelector("#example9");
|
||||
// var user = {
|
||||
// name: "Bob",
|
||||
// age: 30,
|
||||
// occupation: "Software Engineer",
|
||||
// }
|
||||
// api.user_description(user).then(displayResult);
|
||||
// }
|
||||
//
|
||||
// function example10(){
|
||||
// var $ = querySelector("#example10");
|
||||
// api.fail().then(displayResult).catch(displayError);
|
||||
// }
|
||||
//
|
||||
// function example11(){
|
||||
// var $ = querySelector("#example11");
|
||||
// api.make_coffee().then(displayResult).catch(displayError);
|
||||
// }
|
||||
//
|
||||
//
|
||||
// function example12(){
|
||||
// var $ = querySelector("#example12");
|
||||
// var form = $("form");
|
||||
// api.multiply.submitFormData(new FormData(form)).then(displayResult).catch(displayError);
|
||||
// }
|
||||
//
|
||||
// function example13(){
|
||||
// var $ = querySelector("#example13");
|
||||
// var data = {
|
||||
// x: 6,
|
||||
// y: 7,
|
||||
// }
|
||||
// api.multiply.submitJSON(data).then(displayResult).catch(displayError);
|
||||
// }
|
||||
|
||||
|
||||
// api.show_source().then(function(s){
|
||||
// document.querySelector('#source code').innerText = s;
|
||||
// }).then(ready);
|
||||
|
||||
|
||||
function ready(){
|
||||
// // set the <code> element of each example to the corresponding functions source
|
||||
// document.querySelectorAll('li pre code.js').forEach(function(e){
|
||||
// var id = e.parentElement.parentElement.id;
|
||||
// var f = window[id];
|
||||
// var code = f.toString().split('\n').slice(2, -1).join('\n');
|
||||
// e.innerText = unindent(code);
|
||||
// })
|
||||
|
||||
document.querySelectorAll('li pre code.html').forEach(function(e){
|
||||
var html = e.parentElement.parentElement.querySelector('div.example').innerHTML;
|
||||
e.innerText = unindent(html);
|
||||
})
|
||||
|
||||
hljs.initHighlighting();
|
||||
|
||||
// // find all the elements representing the function definitions in the python source
|
||||
// document.querySelectorAll('.python .hljs-function .hljs-title').forEach(function(e){
|
||||
// var a = document.createElement('a');
|
||||
// a.name = e.innerText;
|
||||
// e.parentElement.insertBefore(a, e)
|
||||
// return defs[e.innerText] = e.parentElement;
|
||||
// });
|
||||
|
||||
// convert all 'api.X' strings to hyperlinks to jump to python source
|
||||
document.querySelectorAll('.js').forEach(function(e){
|
||||
var code = e.innerHTML;
|
||||
Object.keys(defs).forEach(function(k){
|
||||
code = code.replace('api.' + k + '(', '<a href="#' + k + '" onclick="jumpTo(\'' + k + '\')">api.' + k + '</a>(');
|
||||
})
|
||||
e.innerHTML = code;
|
||||
})
|
||||
}
|
||||
|
|
@ -138,8 +138,8 @@ class CollectInstancesFromJson(pyblish.api.ContextPlugin):
|
|||
"family": inst["family"],
|
||||
"families": [subset],
|
||||
"jsonData": inst,
|
||||
"parents": , # bez tasku
|
||||
"hierarchy": ,
|
||||
# "parents": , # bez tasku
|
||||
# "hierarchy": ,
|
||||
"publish": True,
|
||||
})
|
||||
self.log.info("collected instance: {}".format(instance.data))
|
||||
|
|
|
|||
2
pype/vendor/pico/client.py
vendored
2
pype/vendor/pico/client.py
vendored
|
|
@ -11,7 +11,7 @@ s = example.hello("Python")
|
|||
Use help(example.hello) or example.hello? as normal to check function parameters and docstrings.
|
||||
"""
|
||||
import os
|
||||
import pico.pragmaticjson as json
|
||||
from . import pragmaticjson as json
|
||||
import imp
|
||||
import requests
|
||||
|
||||
|
|
|
|||
9
pype/vendor/urllib3/__init__.py
vendored
9
pype/vendor/urllib3/__init__.py
vendored
|
|
@ -23,16 +23,11 @@ from .util.retry import Retry
|
|||
|
||||
# Set default logging handler to avoid "No handler found" warnings.
|
||||
import logging
|
||||
try: # Python 2.7+
|
||||
from logging import NullHandler
|
||||
except ImportError:
|
||||
class NullHandler(logging.Handler):
|
||||
def emit(self, record):
|
||||
pass
|
||||
from logging import NullHandler
|
||||
|
||||
__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)'
|
||||
__license__ = 'MIT'
|
||||
__version__ = '1.23'
|
||||
__version__ = '1.24.1'
|
||||
|
||||
__all__ = (
|
||||
'HTTPConnectionPool',
|
||||
|
|
|
|||
5
pype/vendor/urllib3/_collections.py
vendored
5
pype/vendor/urllib3/_collections.py
vendored
|
|
@ -14,10 +14,7 @@ except ImportError: # Platform-specific: No threads available
|
|||
pass
|
||||
|
||||
|
||||
try: # Python 2.7+
|
||||
from collections import OrderedDict
|
||||
except ImportError:
|
||||
from .packages.ordered_dict import OrderedDict
|
||||
from collections import OrderedDict
|
||||
from .exceptions import InvalidHeader
|
||||
from .packages.six import iterkeys, itervalues, PY3
|
||||
|
||||
|
|
|
|||
40
pype/vendor/urllib3/connection.py
vendored
40
pype/vendor/urllib3/connection.py
vendored
|
|
@ -2,7 +2,6 @@ from __future__ import absolute_import
|
|||
import datetime
|
||||
import logging
|
||||
import os
|
||||
import sys
|
||||
import socket
|
||||
from socket import error as SocketError, timeout as SocketTimeout
|
||||
import warnings
|
||||
|
|
@ -78,9 +77,6 @@ class HTTPConnection(_HTTPConnection, object):
|
|||
|
||||
- ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool`
|
||||
- ``source_address``: Set the source address for the current connection.
|
||||
|
||||
.. note:: This is ignored for Python 2.6. It is only applied for 2.7 and 3.x
|
||||
|
||||
- ``socket_options``: Set specific options on the underlying socket. If not specified, then
|
||||
defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling
|
||||
Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy.
|
||||
|
|
@ -108,21 +104,13 @@ class HTTPConnection(_HTTPConnection, object):
|
|||
if six.PY3: # Python 3
|
||||
kw.pop('strict', None)
|
||||
|
||||
# Pre-set source_address in case we have an older Python like 2.6.
|
||||
# Pre-set source_address.
|
||||
self.source_address = kw.get('source_address')
|
||||
|
||||
if sys.version_info < (2, 7): # Python 2.6
|
||||
# _HTTPConnection on Python 2.6 will balk at this keyword arg, but
|
||||
# not newer versions. We can still use it when creating a
|
||||
# connection though, so we pop it *after* we have saved it as
|
||||
# self.source_address.
|
||||
kw.pop('source_address', None)
|
||||
|
||||
#: The socket options provided by the user. If no options are
|
||||
#: provided, we use the default options.
|
||||
self.socket_options = kw.pop('socket_options', self.default_socket_options)
|
||||
|
||||
# Superclass also sets self.source_address in Python 2.7+.
|
||||
_HTTPConnection.__init__(self, *args, **kw)
|
||||
|
||||
@property
|
||||
|
|
@ -183,10 +171,7 @@ class HTTPConnection(_HTTPConnection, object):
|
|||
|
||||
def _prepare_conn(self, conn):
|
||||
self.sock = conn
|
||||
# the _tunnel_host attribute was added in python 2.6.3 (via
|
||||
# http://hg.python.org/cpython/rev/0f57b30a152f) so pythons 2.6(0-2) do
|
||||
# not have them.
|
||||
if getattr(self, '_tunnel_host', None):
|
||||
if self._tunnel_host:
|
||||
# TODO: Fix tunnel so it doesn't depend on self.sock state.
|
||||
self._tunnel()
|
||||
# Mark this connection as not reusable
|
||||
|
|
@ -217,13 +202,13 @@ class HTTPConnection(_HTTPConnection, object):
|
|||
self.endheaders()
|
||||
|
||||
if body is not None:
|
||||
stringish_types = six.string_types + (six.binary_type,)
|
||||
stringish_types = six.string_types + (bytes,)
|
||||
if isinstance(body, stringish_types):
|
||||
body = (body,)
|
||||
for chunk in body:
|
||||
if not chunk:
|
||||
continue
|
||||
if not isinstance(chunk, six.binary_type):
|
||||
if not isinstance(chunk, bytes):
|
||||
chunk = chunk.encode('utf8')
|
||||
len_str = hex(len(chunk))[2:]
|
||||
self.send(len_str.encode('utf-8'))
|
||||
|
|
@ -242,7 +227,7 @@ class HTTPSConnection(HTTPConnection):
|
|||
|
||||
def __init__(self, host, port=None, key_file=None, cert_file=None,
|
||||
strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
|
||||
ssl_context=None, **kw):
|
||||
ssl_context=None, server_hostname=None, **kw):
|
||||
|
||||
HTTPConnection.__init__(self, host, port, strict=strict,
|
||||
timeout=timeout, **kw)
|
||||
|
|
@ -250,6 +235,7 @@ class HTTPSConnection(HTTPConnection):
|
|||
self.key_file = key_file
|
||||
self.cert_file = cert_file
|
||||
self.ssl_context = ssl_context
|
||||
self.server_hostname = server_hostname
|
||||
|
||||
# Required property for Google AppEngine 1.9.0 which otherwise causes
|
||||
# HTTPS requests to go out as HTTP. (See Issue #356)
|
||||
|
|
@ -270,6 +256,7 @@ class HTTPSConnection(HTTPConnection):
|
|||
keyfile=self.key_file,
|
||||
certfile=self.cert_file,
|
||||
ssl_context=self.ssl_context,
|
||||
server_hostname=self.server_hostname
|
||||
)
|
||||
|
||||
|
||||
|
|
@ -312,12 +299,9 @@ class VerifiedHTTPSConnection(HTTPSConnection):
|
|||
def connect(self):
|
||||
# Add certificate verification
|
||||
conn = self._new_conn()
|
||||
|
||||
hostname = self.host
|
||||
if getattr(self, '_tunnel_host', None):
|
||||
# _tunnel_host was added in Python 2.6.3
|
||||
# (See: http://hg.python.org/cpython/rev/0f57b30a152f)
|
||||
|
||||
if self._tunnel_host:
|
||||
self.sock = conn
|
||||
# Calls self._set_hostport(), so self.host is
|
||||
# self._tunnel_host below.
|
||||
|
|
@ -328,6 +312,10 @@ class VerifiedHTTPSConnection(HTTPSConnection):
|
|||
# Override the host with the one we're requesting data from.
|
||||
hostname = self._tunnel_host
|
||||
|
||||
server_hostname = hostname
|
||||
if self.server_hostname is not None:
|
||||
server_hostname = self.server_hostname
|
||||
|
||||
is_time_off = datetime.date.today() < RECENT_DATE
|
||||
if is_time_off:
|
||||
warnings.warn((
|
||||
|
|
@ -352,7 +340,7 @@ class VerifiedHTTPSConnection(HTTPSConnection):
|
|||
certfile=self.cert_file,
|
||||
ca_certs=self.ca_certs,
|
||||
ca_cert_dir=self.ca_cert_dir,
|
||||
server_hostname=hostname,
|
||||
server_hostname=server_hostname,
|
||||
ssl_context=context)
|
||||
|
||||
if self.assert_fingerprint:
|
||||
|
|
@ -373,7 +361,7 @@ class VerifiedHTTPSConnection(HTTPSConnection):
|
|||
'for details.)'.format(hostname)),
|
||||
SubjectAltNameWarning
|
||||
)
|
||||
_match_hostname(cert, self.assert_hostname or hostname)
|
||||
_match_hostname(cert, self.assert_hostname or server_hostname)
|
||||
|
||||
self.is_verified = (
|
||||
context.verify_mode == ssl.CERT_REQUIRED or
|
||||
|
|
|
|||
18
pype/vendor/urllib3/connectionpool.py
vendored
18
pype/vendor/urllib3/connectionpool.py
vendored
|
|
@ -89,7 +89,7 @@ class ConnectionPool(object):
|
|||
|
||||
|
||||
# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252
|
||||
_blocking_errnos = set([errno.EAGAIN, errno.EWOULDBLOCK])
|
||||
_blocking_errnos = {errno.EAGAIN, errno.EWOULDBLOCK}
|
||||
|
||||
|
||||
class HTTPConnectionPool(ConnectionPool, RequestMethods):
|
||||
|
|
@ -313,7 +313,7 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
|
|||
# Catch possible read timeouts thrown as SSL errors. If not the
|
||||
# case, rethrow the original. We need to do this because of:
|
||||
# http://bugs.python.org/issue10272
|
||||
if 'timed out' in str(err) or 'did not complete (read)' in str(err): # Python 2.6
|
||||
if 'timed out' in str(err) or 'did not complete (read)' in str(err): # Python < 2.7.4
|
||||
raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value)
|
||||
|
||||
def _make_request(self, conn, method, url, timeout=_Default, chunked=False,
|
||||
|
|
@ -375,7 +375,7 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
|
|||
try:
|
||||
try: # Python 2.7, use buffering of HTTP responses
|
||||
httplib_response = conn.getresponse(buffering=True)
|
||||
except TypeError: # Python 2.6 and older, Python 3
|
||||
except TypeError: # Python 3
|
||||
try:
|
||||
httplib_response = conn.getresponse()
|
||||
except Exception as e:
|
||||
|
|
@ -801,17 +801,7 @@ class HTTPSConnectionPool(HTTPConnectionPool):
|
|||
Establish tunnel connection early, because otherwise httplib
|
||||
would improperly set Host: header to proxy's IP:port.
|
||||
"""
|
||||
# Python 2.7+
|
||||
try:
|
||||
set_tunnel = conn.set_tunnel
|
||||
except AttributeError: # Platform-specific: Python 2.6
|
||||
set_tunnel = conn._set_tunnel
|
||||
|
||||
if sys.version_info <= (2, 6, 4) and not self.proxy_headers: # Python 2.6.4 and older
|
||||
set_tunnel(self._proxy_host, self.port)
|
||||
else:
|
||||
set_tunnel(self._proxy_host, self.port, self.proxy_headers)
|
||||
|
||||
conn.set_tunnel(self._proxy_host, self.port, self.proxy_headers)
|
||||
conn.connect()
|
||||
|
||||
def _new_conn(self):
|
||||
|
|
|
|||
30
pype/vendor/urllib3/contrib/_appengine_environ.py
vendored
Normal file
30
pype/vendor/urllib3/contrib/_appengine_environ.py
vendored
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
"""
|
||||
This module provides means to detect the App Engine environment.
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
|
||||
def is_appengine():
|
||||
return (is_local_appengine() or
|
||||
is_prod_appengine() or
|
||||
is_prod_appengine_mvms())
|
||||
|
||||
|
||||
def is_appengine_sandbox():
|
||||
return is_appengine() and not is_prod_appengine_mvms()
|
||||
|
||||
|
||||
def is_local_appengine():
|
||||
return ('APPENGINE_RUNTIME' in os.environ and
|
||||
'Development/' in os.environ['SERVER_SOFTWARE'])
|
||||
|
||||
|
||||
def is_prod_appengine():
|
||||
return ('APPENGINE_RUNTIME' in os.environ and
|
||||
'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and
|
||||
not is_prod_appengine_mvms())
|
||||
|
||||
|
||||
def is_prod_appengine_mvms():
|
||||
return os.environ.get('GAE_VM', False) == 'true'
|
||||
36
pype/vendor/urllib3/contrib/appengine.py
vendored
36
pype/vendor/urllib3/contrib/appengine.py
vendored
|
|
@ -39,8 +39,8 @@ urllib3 on Google App Engine:
|
|||
"""
|
||||
|
||||
from __future__ import absolute_import
|
||||
import io
|
||||
import logging
|
||||
import os
|
||||
import warnings
|
||||
from ..packages.six.moves.urllib.parse import urljoin
|
||||
|
||||
|
|
@ -53,11 +53,11 @@ from ..exceptions import (
|
|||
SSLError
|
||||
)
|
||||
|
||||
from ..packages.six import BytesIO
|
||||
from ..request import RequestMethods
|
||||
from ..response import HTTPResponse
|
||||
from ..util.timeout import Timeout
|
||||
from ..util.retry import Retry
|
||||
from . import _appengine_environ
|
||||
|
||||
try:
|
||||
from google.appengine.api import urlfetch
|
||||
|
|
@ -239,7 +239,7 @@ class AppEngineManager(RequestMethods):
|
|||
original_response = HTTPResponse(
|
||||
# In order for decoding to work, we must present the content as
|
||||
# a file-like object.
|
||||
body=BytesIO(urlfetch_resp.content),
|
||||
body=io.BytesIO(urlfetch_resp.content),
|
||||
msg=urlfetch_resp.header_msg,
|
||||
headers=urlfetch_resp.headers,
|
||||
status=urlfetch_resp.status_code,
|
||||
|
|
@ -247,7 +247,7 @@ class AppEngineManager(RequestMethods):
|
|||
)
|
||||
|
||||
return HTTPResponse(
|
||||
body=BytesIO(urlfetch_resp.content),
|
||||
body=io.BytesIO(urlfetch_resp.content),
|
||||
headers=urlfetch_resp.headers,
|
||||
status=urlfetch_resp.status_code,
|
||||
original_response=original_response,
|
||||
|
|
@ -280,26 +280,10 @@ class AppEngineManager(RequestMethods):
|
|||
return retries
|
||||
|
||||
|
||||
def is_appengine():
|
||||
return (is_local_appengine() or
|
||||
is_prod_appengine() or
|
||||
is_prod_appengine_mvms())
|
||||
# Alias methods from _appengine_environ to maintain public API interface.
|
||||
|
||||
|
||||
def is_appengine_sandbox():
|
||||
return is_appengine() and not is_prod_appengine_mvms()
|
||||
|
||||
|
||||
def is_local_appengine():
|
||||
return ('APPENGINE_RUNTIME' in os.environ and
|
||||
'Development/' in os.environ['SERVER_SOFTWARE'])
|
||||
|
||||
|
||||
def is_prod_appengine():
|
||||
return ('APPENGINE_RUNTIME' in os.environ and
|
||||
'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and
|
||||
not is_prod_appengine_mvms())
|
||||
|
||||
|
||||
def is_prod_appengine_mvms():
|
||||
return os.environ.get('GAE_VM', False) == 'true'
|
||||
is_appengine = _appengine_environ.is_appengine
|
||||
is_appengine_sandbox = _appengine_environ.is_appengine_sandbox
|
||||
is_local_appengine = _appengine_environ.is_local_appengine
|
||||
is_prod_appengine = _appengine_environ.is_prod_appengine
|
||||
is_prod_appengine_mvms = _appengine_environ.is_prod_appengine_mvms
|
||||
|
|
|
|||
3
pype/vendor/urllib3/contrib/ntlmpool.py
vendored
3
pype/vendor/urllib3/contrib/ntlmpool.py
vendored
|
|
@ -43,8 +43,7 @@ class NTLMConnectionPool(HTTPSConnectionPool):
|
|||
log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s',
|
||||
self.num_connections, self.host, self.authurl)
|
||||
|
||||
headers = {}
|
||||
headers['Connection'] = 'Keep-Alive'
|
||||
headers = {'Connection': 'Keep-Alive'}
|
||||
req_header = 'Authorization'
|
||||
resp_header = 'www-authenticate'
|
||||
|
||||
|
|
|
|||
25
pype/vendor/urllib3/contrib/pyopenssl.py
vendored
25
pype/vendor/urllib3/contrib/pyopenssl.py
vendored
|
|
@ -163,6 +163,9 @@ def _dnsname_to_stdlib(name):
|
|||
from ASCII bytes. We need to idna-encode that string to get it back, and
|
||||
then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib
|
||||
uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8).
|
||||
|
||||
If the name cannot be idna-encoded then we return None signalling that
|
||||
the name given should be skipped.
|
||||
"""
|
||||
def idna_encode(name):
|
||||
"""
|
||||
|
|
@ -172,14 +175,19 @@ def _dnsname_to_stdlib(name):
|
|||
"""
|
||||
import idna
|
||||
|
||||
for prefix in [u'*.', u'.']:
|
||||
if name.startswith(prefix):
|
||||
name = name[len(prefix):]
|
||||
return prefix.encode('ascii') + idna.encode(name)
|
||||
return idna.encode(name)
|
||||
try:
|
||||
for prefix in [u'*.', u'.']:
|
||||
if name.startswith(prefix):
|
||||
name = name[len(prefix):]
|
||||
return prefix.encode('ascii') + idna.encode(name)
|
||||
return idna.encode(name)
|
||||
except idna.core.IDNAError:
|
||||
return None
|
||||
|
||||
name = idna_encode(name)
|
||||
if sys.version_info >= (3, 0):
|
||||
if name is None:
|
||||
return None
|
||||
elif sys.version_info >= (3, 0):
|
||||
name = name.decode('utf-8')
|
||||
return name
|
||||
|
||||
|
|
@ -223,9 +231,10 @@ def get_subj_alt_name(peer_cert):
|
|||
# Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8
|
||||
# decoded. This is pretty frustrating, but that's what the standard library
|
||||
# does with certificates, and so we need to attempt to do the same.
|
||||
# We also want to skip over names which cannot be idna encoded.
|
||||
names = [
|
||||
('DNS', _dnsname_to_stdlib(name))
|
||||
for name in ext.get_values_for_type(x509.DNSName)
|
||||
('DNS', name) for name in map(_dnsname_to_stdlib, ext.get_values_for_type(x509.DNSName))
|
||||
if name is not None
|
||||
]
|
||||
names.extend(
|
||||
('IP Address', str(name))
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ def backport_makefile(self, mode="r", buffering=None, encoding=None,
|
|||
"""
|
||||
Backport of ``socket.makefile`` from Python 3.5.
|
||||
"""
|
||||
if not set(mode) <= set(["r", "w", "b"]):
|
||||
if not set(mode) <= {"r", "w", "b"}:
|
||||
raise ValueError(
|
||||
"invalid mode %r (only r, w, b allowed)" % (mode,)
|
||||
)
|
||||
|
|
|
|||
259
pype/vendor/urllib3/packages/ordered_dict.py
vendored
259
pype/vendor/urllib3/packages/ordered_dict.py
vendored
|
|
@ -1,259 +0,0 @@
|
|||
# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy.
|
||||
# Passes Python2.7's test suite and incorporates all the latest updates.
|
||||
# Copyright 2009 Raymond Hettinger, released under the MIT License.
|
||||
# http://code.activestate.com/recipes/576693/
|
||||
try:
|
||||
from thread import get_ident as _get_ident
|
||||
except ImportError:
|
||||
from dummy_thread import get_ident as _get_ident
|
||||
|
||||
try:
|
||||
from _abcoll import KeysView, ValuesView, ItemsView
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
|
||||
class OrderedDict(dict):
|
||||
'Dictionary that remembers insertion order'
|
||||
# An inherited dict maps keys to values.
|
||||
# The inherited dict provides __getitem__, __len__, __contains__, and get.
|
||||
# The remaining methods are order-aware.
|
||||
# Big-O running times for all methods are the same as for regular dictionaries.
|
||||
|
||||
# The internal self.__map dictionary maps keys to links in a doubly linked list.
|
||||
# The circular doubly linked list starts and ends with a sentinel element.
|
||||
# The sentinel element never gets deleted (this simplifies the algorithm).
|
||||
# Each link is stored as a list of length three: [PREV, NEXT, KEY].
|
||||
|
||||
def __init__(self, *args, **kwds):
|
||||
'''Initialize an ordered dictionary. Signature is the same as for
|
||||
regular dictionaries, but keyword arguments are not recommended
|
||||
because their insertion order is arbitrary.
|
||||
|
||||
'''
|
||||
if len(args) > 1:
|
||||
raise TypeError('expected at most 1 arguments, got %d' % len(args))
|
||||
try:
|
||||
self.__root
|
||||
except AttributeError:
|
||||
self.__root = root = [] # sentinel node
|
||||
root[:] = [root, root, None]
|
||||
self.__map = {}
|
||||
self.__update(*args, **kwds)
|
||||
|
||||
def __setitem__(self, key, value, dict_setitem=dict.__setitem__):
|
||||
'od.__setitem__(i, y) <==> od[i]=y'
|
||||
# Setting a new item creates a new link which goes at the end of the linked
|
||||
# list, and the inherited dictionary is updated with the new key/value pair.
|
||||
if key not in self:
|
||||
root = self.__root
|
||||
last = root[0]
|
||||
last[1] = root[0] = self.__map[key] = [last, root, key]
|
||||
dict_setitem(self, key, value)
|
||||
|
||||
def __delitem__(self, key, dict_delitem=dict.__delitem__):
|
||||
'od.__delitem__(y) <==> del od[y]'
|
||||
# Deleting an existing item uses self.__map to find the link which is
|
||||
# then removed by updating the links in the predecessor and successor nodes.
|
||||
dict_delitem(self, key)
|
||||
link_prev, link_next, key = self.__map.pop(key)
|
||||
link_prev[1] = link_next
|
||||
link_next[0] = link_prev
|
||||
|
||||
def __iter__(self):
|
||||
'od.__iter__() <==> iter(od)'
|
||||
root = self.__root
|
||||
curr = root[1]
|
||||
while curr is not root:
|
||||
yield curr[2]
|
||||
curr = curr[1]
|
||||
|
||||
def __reversed__(self):
|
||||
'od.__reversed__() <==> reversed(od)'
|
||||
root = self.__root
|
||||
curr = root[0]
|
||||
while curr is not root:
|
||||
yield curr[2]
|
||||
curr = curr[0]
|
||||
|
||||
def clear(self):
|
||||
'od.clear() -> None. Remove all items from od.'
|
||||
try:
|
||||
for node in self.__map.itervalues():
|
||||
del node[:]
|
||||
root = self.__root
|
||||
root[:] = [root, root, None]
|
||||
self.__map.clear()
|
||||
except AttributeError:
|
||||
pass
|
||||
dict.clear(self)
|
||||
|
||||
def popitem(self, last=True):
|
||||
'''od.popitem() -> (k, v), return and remove a (key, value) pair.
|
||||
Pairs are returned in LIFO order if last is true or FIFO order if false.
|
||||
|
||||
'''
|
||||
if not self:
|
||||
raise KeyError('dictionary is empty')
|
||||
root = self.__root
|
||||
if last:
|
||||
link = root[0]
|
||||
link_prev = link[0]
|
||||
link_prev[1] = root
|
||||
root[0] = link_prev
|
||||
else:
|
||||
link = root[1]
|
||||
link_next = link[1]
|
||||
root[1] = link_next
|
||||
link_next[0] = root
|
||||
key = link[2]
|
||||
del self.__map[key]
|
||||
value = dict.pop(self, key)
|
||||
return key, value
|
||||
|
||||
# -- the following methods do not depend on the internal structure --
|
||||
|
||||
def keys(self):
|
||||
'od.keys() -> list of keys in od'
|
||||
return list(self)
|
||||
|
||||
def values(self):
|
||||
'od.values() -> list of values in od'
|
||||
return [self[key] for key in self]
|
||||
|
||||
def items(self):
|
||||
'od.items() -> list of (key, value) pairs in od'
|
||||
return [(key, self[key]) for key in self]
|
||||
|
||||
def iterkeys(self):
|
||||
'od.iterkeys() -> an iterator over the keys in od'
|
||||
return iter(self)
|
||||
|
||||
def itervalues(self):
|
||||
'od.itervalues -> an iterator over the values in od'
|
||||
for k in self:
|
||||
yield self[k]
|
||||
|
||||
def iteritems(self):
|
||||
'od.iteritems -> an iterator over the (key, value) items in od'
|
||||
for k in self:
|
||||
yield (k, self[k])
|
||||
|
||||
def update(*args, **kwds):
|
||||
'''od.update(E, **F) -> None. Update od from dict/iterable E and F.
|
||||
|
||||
If E is a dict instance, does: for k in E: od[k] = E[k]
|
||||
If E has a .keys() method, does: for k in E.keys(): od[k] = E[k]
|
||||
Or if E is an iterable of items, does: for k, v in E: od[k] = v
|
||||
In either case, this is followed by: for k, v in F.items(): od[k] = v
|
||||
|
||||
'''
|
||||
if len(args) > 2:
|
||||
raise TypeError('update() takes at most 2 positional '
|
||||
'arguments (%d given)' % (len(args),))
|
||||
elif not args:
|
||||
raise TypeError('update() takes at least 1 argument (0 given)')
|
||||
self = args[0]
|
||||
# Make progressively weaker assumptions about "other"
|
||||
other = ()
|
||||
if len(args) == 2:
|
||||
other = args[1]
|
||||
if isinstance(other, dict):
|
||||
for key in other:
|
||||
self[key] = other[key]
|
||||
elif hasattr(other, 'keys'):
|
||||
for key in other.keys():
|
||||
self[key] = other[key]
|
||||
else:
|
||||
for key, value in other:
|
||||
self[key] = value
|
||||
for key, value in kwds.items():
|
||||
self[key] = value
|
||||
|
||||
__update = update # let subclasses override update without breaking __init__
|
||||
|
||||
__marker = object()
|
||||
|
||||
def pop(self, key, default=__marker):
|
||||
'''od.pop(k[,d]) -> v, remove specified key and return the corresponding value.
|
||||
If key is not found, d is returned if given, otherwise KeyError is raised.
|
||||
|
||||
'''
|
||||
if key in self:
|
||||
result = self[key]
|
||||
del self[key]
|
||||
return result
|
||||
if default is self.__marker:
|
||||
raise KeyError(key)
|
||||
return default
|
||||
|
||||
def setdefault(self, key, default=None):
|
||||
'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od'
|
||||
if key in self:
|
||||
return self[key]
|
||||
self[key] = default
|
||||
return default
|
||||
|
||||
def __repr__(self, _repr_running={}):
|
||||
'od.__repr__() <==> repr(od)'
|
||||
call_key = id(self), _get_ident()
|
||||
if call_key in _repr_running:
|
||||
return '...'
|
||||
_repr_running[call_key] = 1
|
||||
try:
|
||||
if not self:
|
||||
return '%s()' % (self.__class__.__name__,)
|
||||
return '%s(%r)' % (self.__class__.__name__, self.items())
|
||||
finally:
|
||||
del _repr_running[call_key]
|
||||
|
||||
def __reduce__(self):
|
||||
'Return state information for pickling'
|
||||
items = [[k, self[k]] for k in self]
|
||||
inst_dict = vars(self).copy()
|
||||
for k in vars(OrderedDict()):
|
||||
inst_dict.pop(k, None)
|
||||
if inst_dict:
|
||||
return (self.__class__, (items,), inst_dict)
|
||||
return self.__class__, (items,)
|
||||
|
||||
def copy(self):
|
||||
'od.copy() -> a shallow copy of od'
|
||||
return self.__class__(self)
|
||||
|
||||
@classmethod
|
||||
def fromkeys(cls, iterable, value=None):
|
||||
'''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S
|
||||
and values equal to v (which defaults to None).
|
||||
|
||||
'''
|
||||
d = cls()
|
||||
for key in iterable:
|
||||
d[key] = value
|
||||
return d
|
||||
|
||||
def __eq__(self, other):
|
||||
'''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive
|
||||
while comparison to a regular mapping is order-insensitive.
|
||||
|
||||
'''
|
||||
if isinstance(other, OrderedDict):
|
||||
return len(self)==len(other) and self.items() == other.items()
|
||||
return dict.__eq__(self, other)
|
||||
|
||||
def __ne__(self, other):
|
||||
return not self == other
|
||||
|
||||
# -- the following methods are only used in Python 2.7 --
|
||||
|
||||
def viewkeys(self):
|
||||
"od.viewkeys() -> a set-like object providing a view on od's keys"
|
||||
return KeysView(self)
|
||||
|
||||
def viewvalues(self):
|
||||
"od.viewvalues() -> an object providing a view on od's values"
|
||||
return ValuesView(self)
|
||||
|
||||
def viewitems(self):
|
||||
"od.viewitems() -> a set-like object providing a view on od's items"
|
||||
return ItemsView(self)
|
||||
|
|
@ -9,8 +9,7 @@ import sys
|
|||
# ipaddress has been backported to 2.6+ in pypi. If it is installed on the
|
||||
# system, use it to handle IPAddress ServerAltnames (this was added in
|
||||
# python-3.5) otherwise only do DNS matching. This allows
|
||||
# backports.ssl_match_hostname to continue to be used all the way back to
|
||||
# python-2.4.
|
||||
# backports.ssl_match_hostname to continue to be used in Python 2.7.
|
||||
try:
|
||||
import ipaddress
|
||||
except ImportError:
|
||||
|
|
|
|||
1
pype/vendor/urllib3/poolmanager.py
vendored
1
pype/vendor/urllib3/poolmanager.py
vendored
|
|
@ -47,6 +47,7 @@ _key_fields = (
|
|||
'key__socks_options', # dict
|
||||
'key_assert_hostname', # bool or string
|
||||
'key_assert_fingerprint', # str
|
||||
'key_server_hostname', #str
|
||||
)
|
||||
|
||||
#: The namedtuple class used to construct keys for the connection pool.
|
||||
|
|
|
|||
2
pype/vendor/urllib3/request.py
vendored
2
pype/vendor/urllib3/request.py
vendored
|
|
@ -36,7 +36,7 @@ class RequestMethods(object):
|
|||
explicitly.
|
||||
"""
|
||||
|
||||
_encode_url_methods = set(['DELETE', 'GET', 'HEAD', 'OPTIONS'])
|
||||
_encode_url_methods = {'DELETE', 'GET', 'HEAD', 'OPTIONS'}
|
||||
|
||||
def __init__(self, headers=None):
|
||||
self.headers = headers or {}
|
||||
|
|
|
|||
47
pype/vendor/urllib3/response.py
vendored
47
pype/vendor/urllib3/response.py
vendored
|
|
@ -11,7 +11,7 @@ from .exceptions import (
|
|||
BodyNotHttplibCompatible, ProtocolError, DecodeError, ReadTimeoutError,
|
||||
ResponseNotChunked, IncompleteRead, InvalidHeader
|
||||
)
|
||||
from .packages.six import string_types as basestring, binary_type, PY3
|
||||
from .packages.six import string_types as basestring, PY3
|
||||
from .packages.six.moves import http_client as httplib
|
||||
from .connection import HTTPException, BaseSSLError
|
||||
from .util.response import is_fp_closed, is_response_to_head
|
||||
|
|
@ -23,7 +23,7 @@ class DeflateDecoder(object):
|
|||
|
||||
def __init__(self):
|
||||
self._first_try = True
|
||||
self._data = binary_type()
|
||||
self._data = b''
|
||||
self._obj = zlib.decompressobj()
|
||||
|
||||
def __getattr__(self, name):
|
||||
|
|
@ -69,9 +69,9 @@ class GzipDecoder(object):
|
|||
return getattr(self._obj, name)
|
||||
|
||||
def decompress(self, data):
|
||||
ret = binary_type()
|
||||
ret = bytearray()
|
||||
if self._state == GzipDecoderState.SWALLOW_DATA or not data:
|
||||
return ret
|
||||
return bytes(ret)
|
||||
while True:
|
||||
try:
|
||||
ret += self._obj.decompress(data)
|
||||
|
|
@ -81,16 +81,40 @@ class GzipDecoder(object):
|
|||
self._state = GzipDecoderState.SWALLOW_DATA
|
||||
if previous_state == GzipDecoderState.OTHER_MEMBERS:
|
||||
# Allow trailing garbage acceptable in other gzip clients
|
||||
return ret
|
||||
return bytes(ret)
|
||||
raise
|
||||
data = self._obj.unused_data
|
||||
if not data:
|
||||
return ret
|
||||
return bytes(ret)
|
||||
self._state = GzipDecoderState.OTHER_MEMBERS
|
||||
self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS)
|
||||
|
||||
|
||||
class MultiDecoder(object):
|
||||
"""
|
||||
From RFC7231:
|
||||
If one or more encodings have been applied to a representation, the
|
||||
sender that applied the encodings MUST generate a Content-Encoding
|
||||
header field that lists the content codings in the order in which
|
||||
they were applied.
|
||||
"""
|
||||
|
||||
def __init__(self, modes):
|
||||
self._decoders = [_get_decoder(m.strip()) for m in modes.split(',')]
|
||||
|
||||
def flush(self):
|
||||
return self._decoders[0].flush()
|
||||
|
||||
def decompress(self, data):
|
||||
for d in reversed(self._decoders):
|
||||
data = d.decompress(data)
|
||||
return data
|
||||
|
||||
|
||||
def _get_decoder(mode):
|
||||
if ',' in mode:
|
||||
return MultiDecoder(mode)
|
||||
|
||||
if mode == 'gzip':
|
||||
return GzipDecoder()
|
||||
|
||||
|
|
@ -159,7 +183,7 @@ class HTTPResponse(io.IOBase):
|
|||
self.msg = msg
|
||||
self._request_url = request_url
|
||||
|
||||
if body and isinstance(body, (basestring, binary_type)):
|
||||
if body and isinstance(body, (basestring, bytes)):
|
||||
self._body = body
|
||||
|
||||
self._pool = pool
|
||||
|
|
@ -283,8 +307,13 @@ class HTTPResponse(io.IOBase):
|
|||
# Note: content-encoding value should be case-insensitive, per RFC 7230
|
||||
# Section 3.2
|
||||
content_encoding = self.headers.get('content-encoding', '').lower()
|
||||
if self._decoder is None and content_encoding in self.CONTENT_DECODERS:
|
||||
self._decoder = _get_decoder(content_encoding)
|
||||
if self._decoder is None:
|
||||
if content_encoding in self.CONTENT_DECODERS:
|
||||
self._decoder = _get_decoder(content_encoding)
|
||||
elif ',' in content_encoding:
|
||||
encodings = [e.strip() for e in content_encoding.split(',') if e.strip() in self.CONTENT_DECODERS]
|
||||
if len(encodings):
|
||||
self._decoder = _get_decoder(content_encoding)
|
||||
|
||||
def _decode(self, data, decode_content, flush_decoder):
|
||||
"""
|
||||
|
|
|
|||
8
pype/vendor/urllib3/util/connection.py
vendored
8
pype/vendor/urllib3/util/connection.py
vendored
|
|
@ -1,6 +1,7 @@
|
|||
from __future__ import absolute_import
|
||||
import socket
|
||||
from .wait import NoWayToWaitForSocketError, wait_for_read
|
||||
from ..contrib import _appengine_environ
|
||||
|
||||
|
||||
def is_connection_dropped(conn): # Platform-specific
|
||||
|
|
@ -105,6 +106,13 @@ def _has_ipv6(host):
|
|||
sock = None
|
||||
has_ipv6 = False
|
||||
|
||||
# App Engine doesn't support IPV6 sockets and actually has a quota on the
|
||||
# number of sockets that can be used, so just early out here instead of
|
||||
# creating a socket needlessly.
|
||||
# See https://github.com/urllib3/urllib3/issues/1446
|
||||
if _appengine_environ.is_appengine_sandbox():
|
||||
return False
|
||||
|
||||
if socket.has_ipv6:
|
||||
# has_ipv6 returns true if cPython was compiled with IPv6 support.
|
||||
# It does not tell us if the system has IPv6 support enabled. To
|
||||
|
|
|
|||
10
pype/vendor/urllib3/util/response.py
vendored
10
pype/vendor/urllib3/util/response.py
vendored
|
|
@ -59,8 +59,14 @@ def assert_header_parsing(headers):
|
|||
get_payload = getattr(headers, 'get_payload', None)
|
||||
|
||||
unparsed_data = None
|
||||
if get_payload: # Platform-specific: Python 3.
|
||||
unparsed_data = get_payload()
|
||||
if get_payload:
|
||||
# get_payload is actually email.message.Message.get_payload;
|
||||
# we're only interested in the result if it's not a multipart message
|
||||
if not headers.is_multipart():
|
||||
payload = get_payload()
|
||||
|
||||
if isinstance(payload, (bytes, str)):
|
||||
unparsed_data = payload
|
||||
|
||||
if defects or unparsed_data:
|
||||
raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data)
|
||||
|
|
|
|||
2
pype/vendor/urllib3/util/retry.py
vendored
2
pype/vendor/urllib3/util/retry.py
vendored
|
|
@ -115,7 +115,7 @@ class Retry(object):
|
|||
(most errors are resolved immediately by a second try without a
|
||||
delay). urllib3 will sleep for::
|
||||
|
||||
{backoff factor} * (2 ^ ({number of total retries} - 1))
|
||||
{backoff factor} * (2 ** ({number of total retries} - 1))
|
||||
|
||||
seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep
|
||||
for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer
|
||||
|
|
|
|||
35
pype/vendor/urllib3/util/ssl_.py
vendored
35
pype/vendor/urllib3/util/ssl_.py
vendored
|
|
@ -56,9 +56,8 @@ except ImportError:
|
|||
OP_NO_COMPRESSION = 0x20000
|
||||
|
||||
|
||||
# Python 2.7 and earlier didn't have inet_pton on non-Linux
|
||||
# so we fallback on inet_aton in those cases. This means that
|
||||
# we can only detect IPv4 addresses in this case.
|
||||
# Python 2.7 doesn't have inet_pton on non-Linux so we fallback on inet_aton in
|
||||
# those cases. This means that we can only detect IPv4 addresses in this case.
|
||||
if hasattr(socket, 'inet_pton'):
|
||||
inet_pton = socket.inet_pton
|
||||
else:
|
||||
|
|
@ -67,7 +66,7 @@ else:
|
|||
import ipaddress
|
||||
|
||||
def inet_pton(_, host):
|
||||
if isinstance(host, six.binary_type):
|
||||
if isinstance(host, bytes):
|
||||
host = host.decode('ascii')
|
||||
return ipaddress.ip_address(host)
|
||||
|
||||
|
|
@ -115,10 +114,7 @@ try:
|
|||
except ImportError:
|
||||
import sys
|
||||
|
||||
class SSLContext(object): # Platform-specific: Python 2 & 3.1
|
||||
supports_set_ciphers = ((2, 7) <= sys.version_info < (3,) or
|
||||
(3, 2) <= sys.version_info)
|
||||
|
||||
class SSLContext(object): # Platform-specific: Python 2
|
||||
def __init__(self, protocol_version):
|
||||
self.protocol = protocol_version
|
||||
# Use default values from a real SSLContext
|
||||
|
|
@ -141,12 +137,6 @@ except ImportError:
|
|||
raise SSLError("CA directories not supported in older Pythons")
|
||||
|
||||
def set_ciphers(self, cipher_suite):
|
||||
if not self.supports_set_ciphers:
|
||||
raise TypeError(
|
||||
'Your version of Python does not support setting '
|
||||
'a custom cipher suite. Please upgrade to Python '
|
||||
'2.7, 3.2, or later if you need this functionality.'
|
||||
)
|
||||
self.ciphers = cipher_suite
|
||||
|
||||
def wrap_socket(self, socket, server_hostname=None, server_side=False):
|
||||
|
|
@ -167,10 +157,7 @@ except ImportError:
|
|||
'ssl_version': self.protocol,
|
||||
'server_side': server_side,
|
||||
}
|
||||
if self.supports_set_ciphers: # Platform-specific: Python 2.7+
|
||||
return wrap_socket(socket, ciphers=self.ciphers, **kwargs)
|
||||
else: # Platform-specific: Python 2.6
|
||||
return wrap_socket(socket, **kwargs)
|
||||
return wrap_socket(socket, ciphers=self.ciphers, **kwargs)
|
||||
|
||||
|
||||
def assert_fingerprint(cert, fingerprint):
|
||||
|
|
@ -276,6 +263,8 @@ def create_urllib3_context(ssl_version=None, cert_reqs=None,
|
|||
"""
|
||||
context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23)
|
||||
|
||||
context.set_ciphers(ciphers or DEFAULT_CIPHERS)
|
||||
|
||||
# Setting the default here, as we may have no ssl module on import
|
||||
cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs
|
||||
|
||||
|
|
@ -291,9 +280,6 @@ def create_urllib3_context(ssl_version=None, cert_reqs=None,
|
|||
|
||||
context.options |= options
|
||||
|
||||
if getattr(context, 'supports_set_ciphers', True): # Platform-specific: Python 2.6
|
||||
context.set_ciphers(ciphers or DEFAULT_CIPHERS)
|
||||
|
||||
context.verify_mode = cert_reqs
|
||||
if getattr(context, 'check_hostname', None) is not None: # Platform-specific: Python 3.2
|
||||
# We do our own verification, including fingerprints and alternative
|
||||
|
|
@ -316,8 +302,7 @@ def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None,
|
|||
A pre-made :class:`SSLContext` object. If none is provided, one will
|
||||
be created using :func:`create_urllib3_context`.
|
||||
:param ciphers:
|
||||
A string of ciphers we wish the client to support. This is not
|
||||
supported on Python 2.6 as the ssl module does not support it.
|
||||
A string of ciphers we wish the client to support.
|
||||
:param ca_cert_dir:
|
||||
A directory containing CA certificates in multiple separate files, as
|
||||
supported by OpenSSL's -CApath flag or the capath argument to
|
||||
|
|
@ -334,7 +319,7 @@ def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None,
|
|||
if ca_certs or ca_cert_dir:
|
||||
try:
|
||||
context.load_verify_locations(ca_certs, ca_cert_dir)
|
||||
except IOError as e: # Platform-specific: Python 2.6, 2.7, 3.2
|
||||
except IOError as e: # Platform-specific: Python 2.7
|
||||
raise SSLError(e)
|
||||
# Py33 raises FileNotFoundError which subclasses OSError
|
||||
# These are not equivalent unless we check the errno attribute
|
||||
|
|
@ -378,7 +363,7 @@ def is_ipaddress(hostname):
|
|||
:param str hostname: Hostname to examine.
|
||||
:return: True if the hostname is an IP address, False otherwise.
|
||||
"""
|
||||
if six.PY3 and isinstance(hostname, six.binary_type):
|
||||
if six.PY3 and isinstance(hostname, bytes):
|
||||
# IDN A-label bytes are ASCII compatible.
|
||||
hostname = hostname.decode('ascii')
|
||||
|
||||
|
|
|
|||
5
pype/vendor/urllib3/util/wait.py
vendored
5
pype/vendor/urllib3/util/wait.py
vendored
|
|
@ -43,9 +43,6 @@ if sys.version_info >= (3, 5):
|
|||
else:
|
||||
# Old and broken Pythons.
|
||||
def _retry_on_intr(fn, timeout):
|
||||
if timeout is not None and timeout <= 0:
|
||||
return fn(timeout)
|
||||
|
||||
if timeout is None:
|
||||
deadline = float("inf")
|
||||
else:
|
||||
|
|
@ -117,7 +114,7 @@ def _have_working_poll():
|
|||
# from libraries like eventlet/greenlet.
|
||||
try:
|
||||
poll_obj = select.poll()
|
||||
poll_obj.poll(0)
|
||||
_retry_on_intr(poll_obj.poll, 0)
|
||||
except (AttributeError, OSError):
|
||||
return False
|
||||
else:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue