diff --git a/appengine/urlfetch/README.md b/appengine/urlfetch/README.md new file mode 100644 index 000000000000..8c78705449e5 --- /dev/null +++ b/appengine/urlfetch/README.md @@ -0,0 +1,7 @@ +## App Engine UrlFetch Docs Snippets + +This sample application demonstrates different ways to request a URL +on App Engine + + + diff --git a/appengine/urlfetch/app.yaml b/appengine/urlfetch/app.yaml new file mode 100644 index 000000000000..102ed60d1b57 --- /dev/null +++ b/appengine/urlfetch/app.yaml @@ -0,0 +1,7 @@ +runtime: python27 +api_version: 1 +threadsafe: yes + +handlers: +- url: .* + script: main.app diff --git a/appengine/urlfetch/main.py b/appengine/urlfetch/main.py new file mode 100644 index 000000000000..5b7b194dc6c0 --- /dev/null +++ b/appengine/urlfetch/main.py @@ -0,0 +1,97 @@ +# Copyright 2016 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Sample application that demonstrates different ways of fetching +URLS on App Engine +""" + +import logging +# [START url-imports] +import urllib +import urllib2 + +from google.appengine.api import urlfetch +import webapp2 +# [END url-imports] + + +class UrlLibFetchHandler(webapp2.RequestHandler): + """ Demonstrates an HTTP query using urllib2""" + + def get(self): + # [START urllib-get] + url = "http://www.google.com/" + try: + result = urllib2.urlopen(url) + self.response.write(result.read()) + except urllib2.URLError, e: + logging.error("Caught exception fetching url {}".format(e)) + # [END urllib-get] + + +class UrlFetchHandler(webapp2.RequestHandler): + """ Demonstrates an HTTP query using urlfetch""" + + def get(self): + # [START urlfetch-get] + url = "http://www.googleadsfasdf.com/" + try: + result = urlfetch.fetch(url) + if result.status_code == 200: + self.response.write(result.content) + else: + self.response.status_code = result.status_code + except urlfetch.Error, e: + logging.error("Caught exception fetching url {}".format(e)) + # [END urlfetch-get] + + +class UrlPostHandler(webapp2.RequestHandler): + """ Demonstrates an HTTP POST form query using urlfetch""" + + form_fields = { + "first_name": "Albert", + "last_name": "Johnson", + } + + def get(self): + # [START urlfetch-post] + try: + form_data = urllib.urlencode(UrlPostHandler.form_fields) + headers = {'Content-Type': 'application/x-www-form-urlencoded'} + result = urlfetch.fetch( + url="http://localhost:8080/submit_form", + payload=form_data, + method=urlfetch.POST, + headers=headers) + self.response.write(result.content) + except urlfetch.Error, e: + logging.error("Caught exception fetching url {}".format(e)) + # [END urlfetch-post] + + +class SubmitHandler(webapp2.RequestHandler): + """ Handler that receives UrlPostHandler POST request""" + + def post(self): + self.response.out.write((self.request.get('first_name'))) + + +app = webapp2.WSGIApplication([ + ('/', UrlLibFetchHandler), + ('/url_fetch', UrlFetchHandler), + ('/url_post', UrlPostHandler), + ('/submit_form', SubmitHandler) +], debug=True) diff --git a/appengine/urlfetch/main_test.py b/appengine/urlfetch/main_test.py new file mode 100644 index 000000000000..af33ed2ae128 --- /dev/null +++ b/appengine/urlfetch/main_test.py @@ -0,0 +1,50 @@ +# Copyright 2016 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import main + +import mock +import pytest +import webtest + + +@pytest.fixture +def app(): + return webtest.TestApp(main.app) + + +def test_url_lib(app): + response = app.get('/') + assert response.status_int == 200 + assert "I'm Feeling Lucky" in response.body + + +@mock.patch("main.urlfetch") +def test_url_fetch(urlfetch_mock, app): + urlfetch_mock.fetch = mock.Mock( + return_value=mock.Mock(content="I'm Feeling Lucky", + status_code=200)) + response = app.get('/url_fetch') + assert response.status_int == 200 + assert "I'm Feeling Lucky" in response.body + + +@mock.patch("main.urlfetch") +def test_url_post(urlfetch_mock, app): + urlfetch_mock.fetch = mock.Mock( + return_value=mock.Mock(content="Albert", + status_code=200)) + response = app.get('/url_post') + assert response.status_int == 200 + assert "Albert" in response.body