Due to the issue of the HTTPS proxy handler in Python library urllib2, I can't use Jython to udpate my app to AppEngine. After searhed the web I came up to this solution - use Java class to get html from HTTPS, but still use urllib2 for HTTP proxy.
1. Edit the file google-appengine\google\appengine\tools\appengine_rpc.py, add the line in the header.
import ProxyHTTP
Then in the line 178, update as
response_body = ProxyHTTP.getHTTPS(req.get_full_url() + '?' + req.get_data())
#response = self.opener.open(req)
#response_body = response.read()
And line 359, update as
#opener.add_handler(urllib2.ProxyHandler())
opener.add_handler(ProxyHTTP.HTTPProxyHandler())
2. Create the file google-appengine\google\appengine\tools\ProxyHTTP.py
from java.net import Authenticator
from java.net import PasswordAuthentication
from java.lang import System
from java.net import URL
from urllib2 import ProxyHandler
proxy_info = {
'user' : 'domain\\user',
'pass' : 'password',
'host' : 'host',
'port' : 'port'
}
class auth(Authenticator):
def getPasswordAuthentication(self):
return PasswordAuthentication(proxy_info['user'], proxy_info['pass'])
def getHTTPS(url):
systemSettings = System.getProperties()
systemSettings.put("https.proxyHost", proxy_info['host'])
systemSettings.put("https.proxyPort", proxy_info['port'])
Authenticator.setDefault(auth())
u = URL(url)
d = u.openConnection().getInputStream()
c = d.read()
r = []
while c <> -1:
r.append(chr(c))
c = d.read()
return ''.join(r)
def HTTPProxyHandler():
return ProxyHandler({'http' : \
'http://%(user)s:%(pass)s@%(host)s:%(port)s' % proxy_info})
def main():
urlpath = r'https://www.gmail.com'
print getHTTPS(urlpath)
if __name__ == '__main__':
main()
That's all. But there are still some issues when using Jython for AppEngine. Such as:
- Before upload files, there is a warning: "Problem with getpass. Passwords may be echoed".
- When run the app locally, there is no PIL(I did not install it as it might have many problems).
- When run the app locally with google framework, there is a ImportError: No module named operator.
No comments:
Post a Comment