|  | @@ -1,160 +1,21 @@
 | 
											
												
													
														|  | -import urllib2
 |  | 
 | 
											
												
													
														|  | -try:
 |  | 
 | 
											
												
													
														|  | -    from urlparse import parse_qsl
 |  | 
 | 
											
												
													
														|  | -except ImportError:
 |  | 
 | 
											
												
													
														|  | -    from cgi import parse_qsl
 |  | 
 | 
											
												
													
														|  | -from urllib import urlencode
 |  | 
 | 
											
												
													
														|  | -from urlparse import urlparse
 |  | 
 | 
											
												
													
														|  | 
 |  | +from celery.task.http import (InvalidResponseError, RemoteExecuteError,
 | 
											
												
													
														|  | 
 |  | +                              UnknownStatusError)
 | 
											
												
													
														|  | 
 |  | +from celery.task.http import HttpDispatch as RESTProxy
 | 
											
												
													
														|  | 
 |  | +from celery.task.http import HttpDispatchTask as RESTProxyTask
 | 
											
												
													
														|  | 
 |  | +from celery.task.http import http_task_response as task_response
 | 
											
												
													
														|  | 
 |  | +from celery.task.http import URL, Task
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -from anyjson import serialize, deserialize
 |  | 
 | 
											
												
													
														|  | 
 |  | +import warnings
 | 
											
												
													
														|  | 
 |  | +warnings.warn(DeprecationWarning(
 | 
											
												
													
														|  | 
 |  | +"""celery.task.rest has been deprecated and is scheduled for removal in
 | 
											
												
													
														|  | 
 |  | +v1.2. Please use celery.task.http instead.
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -from celery import __version__ as celery_version
 |  | 
 | 
											
												
													
														|  | -from celery.task.base import Task as BaseTask
 |  | 
 | 
											
												
													
														|  | 
 |  | +The following objects has been renamed:
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +    celery.task.rest.RESTProxy -> celery.task.http.HttpDispatch
 | 
											
												
													
														|  | 
 |  | +    celery.task.rest.RESTProxyTask -> celery.task.http.HttpDispatchTask
 | 
											
												
													
														|  | 
 |  | +    celery.task.rest.task_response -> celery.task.http.http_task_response
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -class InvalidResponseError(Exception):
 |  | 
 | 
											
												
													
														|  | -    """The remote server gave an invalid response."""
 |  | 
 | 
											
												
													
														|  | 
 |  | +Other objects have the same name, just moved to the celery.task.http module.
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -class RemoteExecuteError(Exception):
 |  | 
 | 
											
												
													
														|  | -    """The remote task gave a custom error."""
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -class UnknownStatusError(InvalidResponseError):
 |  | 
 | 
											
												
													
														|  | -    """The remote server gave an unknown status."""
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -class URL(object):
 |  | 
 | 
											
												
													
														|  | -    """Object wrapping a Uniform Resource Locator.
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    Supports editing the query parameter list.
 |  | 
 | 
											
												
													
														|  | -    You can convert the object back to a string, the query will be
 |  | 
 | 
											
												
													
														|  | -    properly urlencoded.
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    Examples
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -        >>> url = URL("http://www.google.com:6580/foo/bar?x=3&y=4#foo")
 |  | 
 | 
											
												
													
														|  | -        >>> url.query
 |  | 
 | 
											
												
													
														|  | -        {'x': '3', 'y': '4'}
 |  | 
 | 
											
												
													
														|  | -        >>> str(url)
 |  | 
 | 
											
												
													
														|  | -        'http://www.google.com:6580/foo/bar?y=4&x=3#foo'
 |  | 
 | 
											
												
													
														|  | -        >>> url.query["x"] = 10
 |  | 
 | 
											
												
													
														|  | -        >>> url.query.update({"George": "Constanza"})
 |  | 
 | 
											
												
													
														|  | -        >>> str(url)
 |  | 
 | 
											
												
													
														|  | -        'http://www.google.com:6580/foo/bar?y=4&x=10&George=Constanza#foo'
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    """
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    def __init__(self, url):
 |  | 
 | 
											
												
													
														|  | -        self.url = urlparse(url)
 |  | 
 | 
											
												
													
														|  | -        self._query = dict(parse_qsl(self.url.query))
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    def _utf8dict(self, tuple_):
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -        def value_encode(val):
 |  | 
 | 
											
												
													
														|  | -            if isinstance(val, unicode):
 |  | 
 | 
											
												
													
														|  | -                return val.encode("utf-8")
 |  | 
 | 
											
												
													
														|  | -            return val
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -        return dict((key.encode("utf-8"), value_encode(value))
 |  | 
 | 
											
												
													
														|  | -                        for key, value in tuple_)
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    def __str__(self):
 |  | 
 | 
											
												
													
														|  | -        u = self.url
 |  | 
 | 
											
												
													
														|  | -        query = urlencode(self._utf8dict(self.query.items()))
 |  | 
 | 
											
												
													
														|  | -        components = ["%s://" % u.scheme,
 |  | 
 | 
											
												
													
														|  | -                      "%s" % u.netloc,
 |  | 
 | 
											
												
													
														|  | -                      u.path and "%s" % u.path or "/",
 |  | 
 | 
											
												
													
														|  | -                      u.params and ";%s" % u.params or None,
 |  | 
 | 
											
												
													
														|  | -                      query and "?%s" % query or None,
 |  | 
 | 
											
												
													
														|  | -                      u.fragment and "#%s" % u.fragment or None]
 |  | 
 | 
											
												
													
														|  | -        return "".join(filter(None, components))
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    def __repr__(self):
 |  | 
 | 
											
												
													
														|  | -        return "<%s %s>" % (self.__class__.__name__, str(self))
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    def _get_query(self):
 |  | 
 | 
											
												
													
														|  | -        return self._query
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    def _set_query(self, query):
 |  | 
 | 
											
												
													
														|  | -        self._query = query
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    query = property(_get_query, _set_query)
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -class RESTProxy(object):
 |  | 
 | 
											
												
													
														|  | -    user_agent = "celery/%s" % celery_version
 |  | 
 | 
											
												
													
														|  | -    timeout = 5
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    def __init__(self, url, task_kwargs, logger):
 |  | 
 | 
											
												
													
														|  | -        self.url = url
 |  | 
 | 
											
												
													
														|  | -        self.task_kwargs = task_kwargs
 |  | 
 | 
											
												
													
														|  | -        self.logger = logger
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    def _create_request(self):
 |  | 
 | 
											
												
													
														|  | -        url = URL(self.url)
 |  | 
 | 
											
												
													
														|  | -        url.query.update(self.task_kwargs)
 |  | 
 | 
											
												
													
														|  | -        req = urllib2.Request(str(url))
 |  | 
 | 
											
												
													
														|  | -        req.headers.update(self.http_headers)
 |  | 
 | 
											
												
													
														|  | -        return req
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    def _make_request(self):
 |  | 
 | 
											
												
													
														|  | -        request = self._create_request()
 |  | 
 | 
											
												
													
														|  | -        opener = urllib2.build_opener()
 |  | 
 | 
											
												
													
														|  | -        response = opener.open(request)
 |  | 
 | 
											
												
													
														|  | -        return response.read()
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    def execute(self):
 |  | 
 | 
											
												
													
														|  | -        response = self._make_request()
 |  | 
 | 
											
												
													
														|  | -        if not response:
 |  | 
 | 
											
												
													
														|  | -            raise InvalidResponseError("Empty response")
 |  | 
 | 
											
												
													
														|  | -        try:
 |  | 
 | 
											
												
													
														|  | -            payload = deserialize(response)
 |  | 
 | 
											
												
													
														|  | -        except ValueError, exc:
 |  | 
 | 
											
												
													
														|  | -            raise InvalidResponseError(str(exc))
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -        # {"status": "success", "retval": 300}
 |  | 
 | 
											
												
													
														|  | -        # {"status": "failure": "reason": "Invalid moon alignment."}
 |  | 
 | 
											
												
													
														|  | -        status = payload["status"]
 |  | 
 | 
											
												
													
														|  | -        if status == "success":
 |  | 
 | 
											
												
													
														|  | -            return payload["retval"]
 |  | 
 | 
											
												
													
														|  | -        elif status == "failure":
 |  | 
 | 
											
												
													
														|  | -            raise RemoteExecuteError(payload["reason"])
 |  | 
 | 
											
												
													
														|  | -        else:
 |  | 
 | 
											
												
													
														|  | -            raise UnknownStatusError(str(status))
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    @property
 |  | 
 | 
											
												
													
														|  | -    def http_headers(self):
 |  | 
 | 
											
												
													
														|  | -        headers = {"Content-Type": "application/json",
 |  | 
 | 
											
												
													
														|  | -                   "User-Agent": self.user_agent}
 |  | 
 | 
											
												
													
														|  | -        return headers
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -class RESTProxyTask(BaseTask):
 |  | 
 | 
											
												
													
														|  | -    name = "celery.task.rest.RESTProxyTask"
 |  | 
 | 
											
												
													
														|  | -    user_agent = "celery %s" % celery_version
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    def run(self, url, **kwargs):
 |  | 
 | 
											
												
													
														|  | -        logger = self.get_logger(**kwargs)
 |  | 
 | 
											
												
													
														|  | -        proxy = RESTProxy(url, kwargs, logger)
 |  | 
 | 
											
												
													
														|  | -        return proxy.execute()
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -def task_response(fun, *args, **kwargs):
 |  | 
 | 
											
												
													
														|  | -    import sys
 |  | 
 | 
											
												
													
														|  | -    try:
 |  | 
 | 
											
												
													
														|  | -        sys.stderr.write("executing %s\n" % fun)
 |  | 
 | 
											
												
													
														|  | -        retval = fun(*args, **kwargs)
 |  | 
 | 
											
												
													
														|  | -        sys.stderr.write("got: %s\n" % retval)
 |  | 
 | 
											
												
													
														|  | -    except Exception, exc:
 |  | 
 | 
											
												
													
														|  | -        response = {"status": "failure", "reason": str(exc)}
 |  | 
 | 
											
												
													
														|  | -    else:
 |  | 
 | 
											
												
													
														|  | -        response = {"status": "success", "retval": retval}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    return serialize(response)
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -class Task(BaseTask):
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    def __call__(self, *args, **kwargs):
 |  | 
 | 
											
												
													
														|  | -        return task_response(self.run, *args, **kwargs)
 |  | 
 | 
											
												
													
														|  | 
 |  | +"""))
 |