1
1
let s: save_cpo = &cpo
2
2
set cpo &vim
3
3
4
+ let s: py2source = expand (' <sfile>:h' ) . ' /HTTP_python2.py'
5
+ let s: py3source = expand (' <sfile>:h' ) . ' /HTTP_python3.py'
4
6
5
7
function ! s: _vital_loaded (V) abort
6
8
let s: V = a: V
@@ -10,7 +12,10 @@ function! s:_vital_loaded(V) abort
10
12
endfunction
11
13
12
14
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
+ \}
14
19
endfunction
15
20
16
21
function ! s: __urlencode_char (c ) abort
@@ -576,100 +581,7 @@ function! s:clients.python3.request(settings) abort
576
581
577
582
" TODO: retry, outputFile
578
583
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
673
585
return responses
674
586
endfunction
675
587
@@ -700,100 +612,7 @@ function! s:clients.python2.request(settings) abort
700
612
701
613
" TODO: retry, outputFile
702
614
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
797
616
return responses
798
617
endfunction
799
618
0 commit comments