Skip to content

Commit 80887bd

Browse files
authored
Merge pull request #742 from tsuyoshicho/feature/webhttp-python-split
Suggestion: separation of python code for Web.HTTP
2 parents 20d4590 + 73a85a1 commit 80887bd

File tree

3 files changed

+190
-189
lines changed

3 files changed

+190
-189
lines changed

autoload/vital/__vital__/Web/HTTP.vim

Lines changed: 8 additions & 189 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
let s:save_cpo = &cpo
22
set cpo&vim
33

4+
let s:py2source = expand('<sfile>:h') . '/HTTP_python2.py'
5+
let s:py3source = expand('<sfile>:h') . '/HTTP_python3.py'
46

57
function! s:_vital_loaded(V) abort
68
let s:V = a:V
@@ -10,7 +12,10 @@ function! s:_vital_loaded(V) abort
1012
endfunction
1113

1214
function! s:_vital_depends() abort
13-
return ['Prelude', 'Data.String', 'Process']
15+
return {
16+
\ 'modules':['Prelude', 'Data.String', 'Process'] ,
17+
\ 'files': ['HTTP_python2.py', 'HTTP_python3.py'],
18+
\}
1419
endfunction
1520

1621
function! s:__urlencode_char(c) abort
@@ -576,100 +581,7 @@ function! s:clients.python3.request(settings) abort
576581

577582
" TODO: retry, outputFile
578583
let responses = []
579-
python3 << ENDPYTHON3
580-
try:
581-
class DummyClassForLocalScope:
582-
def main():
583-
try:
584-
from StringIO import StringIO
585-
except ImportError:
586-
from io import StringIO
587-
import vim, urllib.request, urllib.error, socket, gzip
588-
589-
responses = vim.bindeval('responses')
590-
591-
class CustomHTTPRedirectHandler(urllib.request.HTTPRedirectHandler):
592-
def __init__(self, max_redirect):
593-
self.max_redirect = max_redirect
594-
595-
def redirect_request(self, req, fp, code, msg, headers, newurl):
596-
if self.max_redirect == 0:
597-
return None
598-
if 0 < self.max_redirect:
599-
self.max_redirect -= 1
600-
header_list = list(filter(None, str(headers).split("\r\n")))
601-
responses.extend([[[status(code, msg)] + header_list, fp.read()]])
602-
return urllib.request.HTTPRedirectHandler.redirect_request(self, req, fp, code, msg, headers, newurl)
603-
604-
def vimlist2str(list):
605-
if not list:
606-
return None
607-
return "\n".join([s.replace("\n", "\0") for s in list])
608-
609-
def status(code, msg):
610-
return "HTTP/1.0 %d %s\r\n" % (code, msg)
611-
612-
def access():
613-
settings = vim.eval('a:settings')
614-
data = vimlist2str(settings.get('data'))
615-
timeout = settings.get('timeout')
616-
if timeout:
617-
timeout = float(timeout)
618-
request_headers = settings.get('headers')
619-
max_redirect = int(settings.get('maxRedirect'))
620-
director = urllib.request.build_opener(CustomHTTPRedirectHandler(max_redirect))
621-
if 'username' in settings:
622-
passman = urllib.request.HTTPPasswordMgrWithDefaultRealm()
623-
passman.add_password(
624-
None,
625-
settings['url'],
626-
settings['username'],
627-
settings.get('password', ''))
628-
basicauth = urllib.request.HTTPBasicAuthHandler(passman)
629-
digestauth = urllib.request.HTTPDigestAuthHandler(passman)
630-
director.add_handler(basicauth)
631-
director.add_handler(digestauth)
632-
if 'bearerToken' in settings:
633-
request_headers.setdefault('Authorization', 'Bearer ' + settings['bearerToken'])
634-
req = urllib.request.Request(settings['url'], data, request_headers)
635-
req.get_method = lambda: settings['method']
636-
default_timeout = socket.getdefaulttimeout()
637-
try:
638-
# for Python 2.5 or before <- Is this needed?
639-
socket.setdefaulttimeout(timeout)
640-
res = director.open(req, timeout=timeout)
641-
except urllib.error.HTTPError as res:
642-
pass
643-
except urllib.error.URLError:
644-
return ('', '')
645-
except socket.timeout:
646-
return ('', '')
647-
finally:
648-
socket.setdefaulttimeout(default_timeout)
649-
650-
st = status(res.code, res.msg)
651-
response_headers = st + ''.join(res.headers)
652-
response_body = res.read()
653-
654-
gzip_decompress = settings.get('gzipDecompress', False)
655-
if gzip_decompress:
656-
buf = StringIO(response_body)
657-
f = gzip.GzipFile(fileobj=buf)
658-
response_body = f.read()[:-1]
659-
660-
return (response_headers, response_body)
661-
662-
(header, body) = access()
663-
responses.extend([[header.split("\r\n"), body]])
664-
665-
main()
666-
raise RuntimeError("Exit from local scope")
667-
668-
except RuntimeError as exception:
669-
if exception.args != ("Exit from local scope",):
670-
raise exception
671-
672-
ENDPYTHON3
584+
execute 'py3file' s:py3source
673585
return responses
674586
endfunction
675587

@@ -700,100 +612,7 @@ function! s:clients.python2.request(settings) abort
700612

701613
" TODO: retry, outputFile
702614
let responses = []
703-
python << ENDPYTHON
704-
try:
705-
class DummyClassForLocalScope:
706-
def main():
707-
try:
708-
from StringIO import StringIO
709-
except ImportError:
710-
from io import StringIO
711-
import vim, urllib2, socket, gzip
712-
713-
responses = vim.bindeval('responses')
714-
715-
class CustomHTTPRedirectHandler(urllib2.HTTPRedirectHandler):
716-
def __init__(self, max_redirect):
717-
self.max_redirect = max_redirect
718-
719-
def redirect_request(self, req, fp, code, msg, headers, newurl):
720-
if self.max_redirect == 0:
721-
return None
722-
if 0 < self.max_redirect:
723-
self.max_redirect -= 1
724-
header_list = filter(None, str(headers).split("\r\n"))
725-
responses.extend([[[status(code, msg)] + header_list, fp.read()]])
726-
return urllib2.HTTPRedirectHandler.redirect_request(self, req, fp, code, msg, headers, newurl)
727-
728-
def vimlist2str(list):
729-
if not list:
730-
return None
731-
return "\n".join([s.replace("\n", "\0") for s in list])
732-
733-
def status(code, msg):
734-
return "HTTP/1.0 %d %s\r\n" % (code, msg)
735-
736-
def access():
737-
settings = vim.eval('a:settings')
738-
data = vimlist2str(settings.get('data'))
739-
timeout = settings.get('timeout')
740-
if timeout:
741-
timeout = float(timeout)
742-
request_headers = settings.get('headers')
743-
max_redirect = int(settings.get('maxRedirect'))
744-
director = urllib2.build_opener(CustomHTTPRedirectHandler(max_redirect))
745-
if settings.has_key('username'):
746-
passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
747-
passman.add_password(
748-
None,
749-
settings['url'],
750-
settings['username'],
751-
settings.get('password', ''))
752-
basicauth = urllib2.HTTPBasicAuthHandler(passman)
753-
digestauth = urllib2.HTTPDigestAuthHandler(passman)
754-
director.add_handler(basicauth)
755-
director.add_handler(digestauth)
756-
if settings.has_key('bearerToken'):
757-
request_headers.setdefault('Authorization', 'Bearer ' + settings['bearerToken'])
758-
req = urllib2.Request(settings['url'], data, request_headers)
759-
req.get_method = lambda: settings['method']
760-
default_timeout = socket.getdefaulttimeout()
761-
try:
762-
# for Python 2.5 or before
763-
socket.setdefaulttimeout(timeout)
764-
res = director.open(req, timeout=timeout)
765-
except urllib2.HTTPError as res:
766-
pass
767-
except urllib2.URLError:
768-
return ('', '')
769-
except socket.timeout:
770-
return ('', '')
771-
finally:
772-
socket.setdefaulttimeout(default_timeout)
773-
774-
st = status(res.code, res.msg)
775-
response_headers = st + ''.join(res.info().headers)
776-
response_body = res.read()
777-
778-
gzip_decompress = settings.get('gzipDecompress', False)
779-
if gzip_decompress:
780-
buf = StringIO(response_body)
781-
f = gzip.GzipFile(fileobj=buf)
782-
response_body = f.read()[:-1]
783-
784-
return (response_headers, response_body)
785-
786-
(header, body) = access()
787-
responses.extend([[header.split("\r\n"), body]])
788-
789-
main()
790-
raise RuntimeError("Exit from local scope")
791-
792-
except RuntimeError as exception:
793-
if exception.args != ("Exit from local scope",):
794-
raise exception
795-
796-
ENDPYTHON
615+
execute 'pyfile' s:py2source
797616
return responses
798617
endfunction
799618

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
try:
2+
class DummyClassForLocalScope:
3+
def main():
4+
try:
5+
from StringIO import StringIO
6+
except ImportError:
7+
from io import StringIO
8+
import vim, urllib2, socket, gzip
9+
10+
responses = vim.bindeval('responses')
11+
12+
class CustomHTTPRedirectHandler(urllib2.HTTPRedirectHandler):
13+
def __init__(self, max_redirect):
14+
self.max_redirect = max_redirect
15+
16+
def redirect_request(self, req, fp, code, msg, headers, newurl):
17+
if self.max_redirect == 0:
18+
return None
19+
if 0 < self.max_redirect:
20+
self.max_redirect -= 1
21+
header_list = filter(None, str(headers).split("\r\n"))
22+
responses.extend([[[status(code, msg)] + header_list, fp.read()]])
23+
return urllib2.HTTPRedirectHandler.redirect_request(self, req, fp, code, msg, headers, newurl)
24+
25+
def vimlist2str(list):
26+
if not list:
27+
return None
28+
return "\n".join([s.replace("\n", "\0") for s in list])
29+
30+
def status(code, msg):
31+
return "HTTP/1.0 %d %s\r\n" % (code, msg)
32+
33+
def access():
34+
settings = vim.eval('a:settings')
35+
data = vimlist2str(settings.get('data'))
36+
timeout = settings.get('timeout')
37+
if timeout:
38+
timeout = float(timeout)
39+
request_headers = settings.get('headers')
40+
max_redirect = int(settings.get('maxRedirect'))
41+
director = urllib2.build_opener(CustomHTTPRedirectHandler(max_redirect))
42+
if settings.has_key('username'):
43+
passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
44+
passman.add_password(
45+
None,
46+
settings['url'],
47+
settings['username'],
48+
settings.get('password', ''))
49+
basicauth = urllib2.HTTPBasicAuthHandler(passman)
50+
digestauth = urllib2.HTTPDigestAuthHandler(passman)
51+
director.add_handler(basicauth)
52+
director.add_handler(digestauth)
53+
if settings.has_key('bearerToken'):
54+
request_headers.setdefault('Authorization', 'Bearer ' + settings['bearerToken'])
55+
req = urllib2.Request(settings['url'], data, request_headers)
56+
req.get_method = lambda: settings['method']
57+
default_timeout = socket.getdefaulttimeout()
58+
try:
59+
# for Python 2.5 or before
60+
socket.setdefaulttimeout(timeout)
61+
res = director.open(req, timeout=timeout)
62+
except urllib2.HTTPError as res:
63+
pass
64+
except urllib2.URLError:
65+
return ('', '')
66+
except socket.timeout:
67+
return ('', '')
68+
finally:
69+
socket.setdefaulttimeout(default_timeout)
70+
71+
st = status(res.code, res.msg)
72+
response_headers = st + ''.join(res.info().headers)
73+
response_body = res.read()
74+
75+
gzip_decompress = settings.get('gzipDecompress', False)
76+
if gzip_decompress:
77+
buf = StringIO(response_body)
78+
f = gzip.GzipFile(fileobj=buf)
79+
response_body = f.read()[:-1]
80+
81+
return (response_headers, response_body)
82+
83+
(header, body) = access()
84+
responses.extend([[header.split("\r\n"), body]])
85+
86+
main()
87+
raise RuntimeError("Exit from local scope")
88+
89+
except RuntimeError as exception:
90+
if exception.args != ("Exit from local scope",):
91+
raise exception

0 commit comments

Comments
 (0)