Skip to content

Commit

Permalink
Resource proxy has better error reporting and tests
Browse files Browse the repository at this point in the history
  • Loading branch information
domoritz committed Nov 14, 2012
1 parent 2c22840 commit e1c6fc9
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 7 deletions.
14 changes: 12 additions & 2 deletions ckanext/resourceproxy/controller.py
@@ -1,6 +1,9 @@
import urllib2
import shutil
from logging import getLogger

from pylons.controllers.util import abort as abort

import ckan.logic as logic
import ckan.lib.base as base

Expand All @@ -13,15 +16,22 @@ def proxy_resource(context, data_dict):
log.info('Proxify resource {id}'.format(id=resource_id))
resource = logic.get_action('resource_show')(context, {'id': resource_id})
url = resource['url']
had_http_error = False
try:
res = urllib2.urlopen(url)
except urllib2.URLError, error:
except urllib2.HTTPError, error:
res = error
had_http_error = True
except urllib2.URLError, error:
details = "Could not proxy resource. " + str(error.reason)
abort(500, detail=details)
base.response.headers = res.headers

import shutil
shutil.copyfileobj(res, base.response)

if had_http_error and hasattr(res, 'code'):
abort(res.code)


class ProxyController(base.BaseController):
def proxy_resource(self, resource_id):
Expand Down
24 changes: 19 additions & 5 deletions ckanext/resourceproxy/tests/test_proxy.py
@@ -1,8 +1,9 @@
import os
import json
import subprocess
import requests
import time
import urllib2
import unittest

import ckan.logic as l
import ckan.model as model
Expand All @@ -16,12 +17,12 @@
import ckanext.resourceproxy.plugin as proxy


class TestProxyBasic(tests.WsgiAppCase):
class TestProxyBasic(tests.WsgiAppCase, unittest.TestCase):

@classmethod
def setup_class(cls):
config = appconfig('config:test.ini', relative_to=tests.conf_dir)
config.local_conf['ckan.plugins'] = 'resourceproxy'
config.local_conf['ckan.plugins'] = 'resource_proxy'
wsgiapp = make_app(config.global_conf, **config.local_conf)
cls.app = paste.fixture.TestApp(wsgiapp)

Expand Down Expand Up @@ -78,7 +79,7 @@ def test_resource_proxy_on_200(self):
assert "yes, I'm proxied" in result.content, result.content

proxied_url = proxy.get_proxified_resource_url(self.data_dict)
result = self.app.get(proxied_url)
result = self.app.get(proxied_url, status='*')
assert result.status == 200, result.status
assert "yes, I'm proxied" in result.body, result.body

Expand All @@ -90,5 +91,18 @@ def test_resource_proxy_on_404(self):
assert result.status_code == 404, result.status_code

proxied_url = proxy.get_proxified_resource_url(self.data_dict)
result = self.app.get(proxied_url)
result = self.app.get(proxied_url, status='*')
assert result.status == 404, result.status

def test_resource_proxy_non_existent(self):
self.set_resource_url('http://foo.bar')

def f1():
url = self.data_dict['resource']['url']
requests.get(url)
self.assertRaises(requests.ConnectionError, f1)

proxied_url = proxy.get_proxified_resource_url(self.data_dict)
result = self.app.get(proxied_url, status='*')
assert result.status == 500, result.status
assert 'Could not proxy resource' in result.body, result.body

0 comments on commit e1c6fc9

Please sign in to comment.