{ "info": { "author": "Praekelt Foundation", "author_email": "dev@praekeltfoundation.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: POSIX", "Programming Language :: Python", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Networking" ], "description": "device-proxy\n============\n\nInspects incoming HTTP requests adds some HTTP headers and proxies upstream.\nHas ability to add extra cookies for HTTP responses being sent back to the\nclient.\n\n|travis|_ |coveralls|_\n\nInstallation\n------------\n\n $ pip install device-proxy\n\nRunning\n-------\n\nRun with `twistd`::\n\n $ twistd -n devproxy --config config.yaml\n\n\nConfiguration\n-------------\n\nThis is what the processing chain looks like::\n\n +------------------+\n | |\n | Header & Cookie set\n v |\n (1) HAProxy -> (2) *n* DeviceProxies\n |\n (3)\n | (if Cookie or Header set)\n +--------------------------------> (4) *n* Backend Apps\n\n1. Haproxy receives incoming traffic from Nginx\n2. Request is passed to *n* number of Device Proxies running.\n HTTP headers are inserted (possibly from cached WURFL or OpenDDR lookups).\n Device Proxy has the option of inserting Cookies into the HTTP response\n which can cache the Device Lookup (for subsequent requests HAProxy (1)\n could use these cookie values to skip DeviceProxy completely for the\n lifetime of the Cookie.)\n DeviceProxy reverse proxies back to HAProxy with HTTP headers inserted.\n3. HAProxy inspects the HTTP headers & cookies received and selects appropriate\n backend application for the request. HAProxy can have a default fallback\n backend. If the Cookie is already set then the DeviceProxies are skipped.\n4. The Backend application renders the request with a template set suitable for\n the given HTTP request.\n\n.. note:: By default DeviceProxy only caches the lookup in Memcache, not in the Cookie.\n\n\n.. |travis| image:: https://travis-ci.org/praekelt/device-proxy.png?branch=develop\n.. _travis: https://travis-ci.org/praekelt/device-proxy\n\n.. |coveralls| image:: https://coveralls.io/repos/praekelt/device-proxy/badge.png?branch=develop\n.. _coveralls: https://coveralls.io/r/praekelt/device-proxy", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/praekelt/device-proxy", "keywords": null, "license": "BSD", "maintainer": null, "maintainer_email": null, "name": "device-proxy", "package_url": "https://pypi.org/project/device-proxy/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/device-proxy/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://github.com/praekelt/device-proxy" }, "release_url": "https://pypi.org/project/device-proxy/0.4.3/", "requires_dist": null, "requires_python": null, "summary": "Device Proxy. A reverse HTTP Proxy that can inspect and manipulate HTTP Headers before sending upstream.", "version": "0.4.3" }, "last_serial": 2516216, "releases": { "0.1b": [ { "comment_text": "", "digests": { "md5": "e0f5a2d03daab62a6e07b266808dc004", "sha256": "87976a9d3496e497f05d093bc854788746dc1e605e5629b44584c981739d4c60" }, "downloads": -1, "filename": "device-proxy-0.1b.tar.gz", "has_sig": false, "md5_digest": "e0f5a2d03daab62a6e07b266808dc004", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12345, "upload_time": "2013-01-24T19:28:13", "url": "https://files.pythonhosted.org/packages/96/2e/3bf2a599334184cc4acbd98016c45853c75d894d291ed0daea452e520b9a/device-proxy-0.1b.tar.gz" } ], "0.1c": [ { "comment_text": "", "digests": { "md5": "69caccddb866d479861e588e484086eb", "sha256": "598022a5403b1befb21e3dbcef82e3cca3da0ee6177c9570c450891422af3198" }, "downloads": -1, "filename": "device-proxy-0.1c.tar.gz", "has_sig": false, "md5_digest": "69caccddb866d479861e588e484086eb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12410, "upload_time": "2013-02-18T15:04:23", "url": "https://files.pythonhosted.org/packages/bc/b8/533b1325260501cc7e0643c80aa99b606c8c3c3b0b333227472c28154a16/device-proxy-0.1c.tar.gz" } ], "0.1d": [ { "comment_text": "", "digests": { "md5": "2e5699cf6c89b364dbca86dcdd66ada7", "sha256": "a399e2daae9b3fe8990dad6dad8c99a2d2b86e4600273ef2717374d443022fea" }, "downloads": -1, "filename": "device-proxy-0.1d.tar.gz", "has_sig": false, "md5_digest": "2e5699cf6c89b364dbca86dcdd66ada7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12416, "upload_time": "2013-02-18T17:51:57", "url": "https://files.pythonhosted.org/packages/72/49/00870c33c06689bb46a465dabd0653f9b4844ac72f4d8892c49294e3b808/device-proxy-0.1d.tar.gz" } ], "0.1e": [ { "comment_text": "", "digests": { "md5": "27517488b69df1c0a8f5687e2ca04f34", "sha256": "a0d0fde4fc4489ceae005953d24ee65a6c2911bc37e8bbc8d88ffcdc6bf2006f" }, "downloads": -1, "filename": "device-proxy-0.1e.tar.gz", "has_sig": false, "md5_digest": "27517488b69df1c0a8f5687e2ca04f34", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6028, "upload_time": "2013-05-02T13:00:04", "url": "https://files.pythonhosted.org/packages/92/37/ece61e4d8033dcf80d3416535a9bf7c190787e9b14c425b19b31562ef518/device-proxy-0.1e.tar.gz" } ], "0.1f": [ { "comment_text": "", "digests": { "md5": "b9921ee16216aac4af54ddff8ddc6308", "sha256": "d5b53bf3b1fe1eae407a6528546d77fe9660dfa7ad734155baae975cb3856acf" }, "downloads": -1, "filename": "device-proxy-0.1f.tar.gz", "has_sig": false, "md5_digest": "b9921ee16216aac4af54ddff8ddc6308", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 757653, "upload_time": "2013-05-02T14:10:49", "url": "https://files.pythonhosted.org/packages/41/c3/5b2472f870b03dad6960d3eac773827dfabfc727be4a5f61a7874bdc80e8/device-proxy-0.1f.tar.gz" } ], "0.1g": [ { "comment_text": "", "digests": { "md5": "4355af60f76034ed132df686f164200a", "sha256": "e5b0daacb1df7405e0b6e2b6a6044b3ccc692aa0a1a08ab980cb95e8690fc7d8" }, "downloads": -1, "filename": "device-proxy-0.1g.tar.gz", "has_sig": false, "md5_digest": "4355af60f76034ed132df686f164200a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27291, "upload_time": "2013-05-02T14:15:33", "url": "https://files.pythonhosted.org/packages/3c/8a/1a62922c2e905fdde0bcda8ec5fbb968e5109a12a07a8362e0ffb0edd0db/device-proxy-0.1g.tar.gz" } ], "0.1h": [ { "comment_text": "", "digests": { "md5": "7566e80e81066a00352e14fc8b311a04", "sha256": "4bb9868997fbfe740b5817695b7ac808b1299f250635578da4fb9fcae7378ffd" }, "downloads": -1, "filename": "device-proxy-0.1h.tar.gz", "has_sig": false, "md5_digest": "7566e80e81066a00352e14fc8b311a04", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27567, "upload_time": "2013-05-04T18:24:50", "url": "https://files.pythonhosted.org/packages/01/c1/8a72f15c23e6c2bc49892c2a52aa67f7e330d4fbf8319cd65e4a1f756577/device-proxy-0.1h.tar.gz" } ], "0.1i": [ { "comment_text": "", "digests": { "md5": "51965575a14eed04ef365f7ac94271ad", "sha256": "d222dc4c97a7cf8cad9e0f16087492b140e69d50aeadbe015751ea5485ec92cb" }, "downloads": -1, "filename": "device-proxy-0.1i.tar.gz", "has_sig": false, "md5_digest": "51965575a14eed04ef365f7ac94271ad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27610, "upload_time": "2013-05-15T10:00:35", "url": "https://files.pythonhosted.org/packages/1b/46/2deddf6addbc8f645adf899f5089a950e58e4fbed20a6aff9a5564f272a5/device-proxy-0.1i.tar.gz" } ], "0.1j": [ { "comment_text": "", "digests": { "md5": "7c61c08859c5db5d8506ab551f7979f1", "sha256": "5534144f4b2f06bc3d955816ed394a9b0a6b4b9634836bf555e451ff53ca0679" }, "downloads": -1, "filename": "device-proxy-0.1j.tar.gz", "has_sig": false, "md5_digest": "7c61c08859c5db5d8506ab551f7979f1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27617, "upload_time": "2013-05-15T11:50:57", "url": "https://files.pythonhosted.org/packages/43/4a/0052e8fdf638a5eb77daa51a5070a72cea51d87a26a8e75005e068f833c0/device-proxy-0.1j.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "0787260f29f465237b839eac0834d55f", "sha256": "eb2a3ff2ba09d6041c56449a4e4ed656584215ca8e6b248ff222f00c673ba69f" }, "downloads": -1, "filename": "device-proxy-0.2.tar.gz", "has_sig": false, "md5_digest": "0787260f29f465237b839eac0834d55f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12837, "upload_time": "2014-04-01T13:57:17", "url": "https://files.pythonhosted.org/packages/f0/e5/354b53ac9d7191a5877a7f0fa5d42c12af4be4c9855cf42d357b7e98520b/device-proxy-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "e014c84e360814ef42ee703e95d5553a", "sha256": "484f96c9e7ba9839784a41d5f892edb98cef1333ac9f54035bedf0c0881b3290" }, "downloads": -1, "filename": "device-proxy-0.3.tar.gz", "has_sig": false, "md5_digest": "e014c84e360814ef42ee703e95d5553a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15415, "upload_time": "2014-04-07T12:47:21", "url": "https://files.pythonhosted.org/packages/7c/18/2aed96b7b535c9c12abb4070d5d611f289310de32ad0b91db2f9ddece3de/device-proxy-0.3.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "511e90624242ebed3c14bdd96348ddf0", "sha256": "3ec19a38371d7ad2774a2cc2a26824c6de03af94cbfeb8ea795482610c96557c" }, "downloads": -1, "filename": "device_proxy-0.4-py2.7.egg", "has_sig": false, "md5_digest": "511e90624242ebed3c14bdd96348ddf0", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 56290, "upload_time": "2014-07-28T14:42:55", "url": "https://files.pythonhosted.org/packages/c0/98/2573802fbb22b1f29805fa1acce134b0b60950328c935bb15d6ef93bceeb/device_proxy-0.4-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "603d057f02306304b5def0c455f689e3", "sha256": "367f401c41746ad481dd87f5682f5c946386a0201412117c81b8741de1bdb118" }, "downloads": -1, "filename": "device-proxy-0.4.tar.gz", "has_sig": false, "md5_digest": "603d057f02306304b5def0c455f689e3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17170, "upload_time": "2014-07-28T14:42:51", "url": "https://files.pythonhosted.org/packages/72/22/7910ef1868ce67988c2fbc41d9d797bc42adbbc3898976dcb12527e48fce/device-proxy-0.4.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "b1f973f370033c30a32a017898e4222d", "sha256": "5cc9b923bd234ef4a737c8d4402b23d1b48f4fff52b79a6d259870e0b508bec0" }, "downloads": -1, "filename": "device_proxy-0.4.1-py2.7.egg", "has_sig": false, "md5_digest": "b1f973f370033c30a32a017898e4222d", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 56322, "upload_time": "2014-07-30T13:32:21", "url": "https://files.pythonhosted.org/packages/90/7e/e497168094a4513023880e2fd507d3a74717fdeb656ed71aba1cdc7f1c9e/device_proxy-0.4.1-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "3a2bbb03aea9a1768cdbb081faf7ecee", "sha256": "6979dfb85e08f92c571403904853b1dd6d86aade20dc2e79915fbfc3ab225916" }, "downloads": -1, "filename": "device-proxy-0.4.1.tar.gz", "has_sig": false, "md5_digest": "3a2bbb03aea9a1768cdbb081faf7ecee", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17179, "upload_time": "2014-07-30T13:32:17", "url": "https://files.pythonhosted.org/packages/00/6c/c8aa179742d6ed1d3c1db48073dc43e95a6ac0eaa97f08ba570079f3e07a/device-proxy-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "fd2164a6a3e810614a66dd1c3debd3fe", "sha256": "b13eb31e4dc1abacb16a074cdfb0dd33929e61c46524f21aed25c0b9a8d84b64" }, "downloads": -1, "filename": "device_proxy-0.4.2-py2.7.egg", "has_sig": false, "md5_digest": "fd2164a6a3e810614a66dd1c3debd3fe", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 57652, "upload_time": "2015-06-10T13:57:55", "url": "https://files.pythonhosted.org/packages/47/fe/9b9937e34a9aa0acf4735ac9742114e816a22d79e7713c89d620ac894c18/device_proxy-0.4.2-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "83b4a1f2ccd98a9ac81b8d73050b0b76", "sha256": "4f6594ce59daa9e891f46cae6c288fb81c2247d6b10774db00301ba9f2f2354a" }, "downloads": -1, "filename": "device-proxy-0.4.2.tar.gz", "has_sig": false, "md5_digest": "83b4a1f2ccd98a9ac81b8d73050b0b76", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17650, "upload_time": "2015-06-10T13:57:49", "url": "https://files.pythonhosted.org/packages/ce/3d/85813fd2e7f1e280cca03d3618d1a5234508dae2cda3d8ece3d9d8a65328/device-proxy-0.4.2.tar.gz" } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "c82fbf28b8e28129993f44f38ad7667f", "sha256": "577bace99924894dda37e907a03fe15003fcbbbc7ada878809837b74ef3fe1b8" }, "downloads": -1, "filename": "device_proxy-0.4.3-py2.7.egg", "has_sig": false, "md5_digest": "c82fbf28b8e28129993f44f38ad7667f", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 57596, "upload_time": "2015-06-23T08:02:19", "url": "https://files.pythonhosted.org/packages/1d/22/13dd9d346c04c270d935cb2318c32cb33cda66d9e852ceb473cffa9efa24/device_proxy-0.4.3-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "0ecbf7d2e33fb5ff053c1c32b0825556", "sha256": "7411abac48b04c8e5e3935e66d36a5517cd4d163945344c812fa5886c386c7e6" }, "downloads": -1, "filename": "device-proxy-0.4.3.tar.gz", "has_sig": false, "md5_digest": "0ecbf7d2e33fb5ff053c1c32b0825556", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17632, "upload_time": "2015-06-23T08:02:13", "url": "https://files.pythonhosted.org/packages/af/87/fce067e6e625403c5ab5923782599e0a0c87dad9f1ae62d2c53aa7e21de4/device-proxy-0.4.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c82fbf28b8e28129993f44f38ad7667f", "sha256": "577bace99924894dda37e907a03fe15003fcbbbc7ada878809837b74ef3fe1b8" }, "downloads": -1, "filename": "device_proxy-0.4.3-py2.7.egg", "has_sig": false, "md5_digest": "c82fbf28b8e28129993f44f38ad7667f", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 57596, "upload_time": "2015-06-23T08:02:19", "url": "https://files.pythonhosted.org/packages/1d/22/13dd9d346c04c270d935cb2318c32cb33cda66d9e852ceb473cffa9efa24/device_proxy-0.4.3-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "0ecbf7d2e33fb5ff053c1c32b0825556", "sha256": "7411abac48b04c8e5e3935e66d36a5517cd4d163945344c812fa5886c386c7e6" }, "downloads": -1, "filename": "device-proxy-0.4.3.tar.gz", "has_sig": false, "md5_digest": "0ecbf7d2e33fb5ff053c1c32b0825556", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17632, "upload_time": "2015-06-23T08:02:13", "url": "https://files.pythonhosted.org/packages/af/87/fce067e6e625403c5ab5923782599e0a0c87dad9f1ae62d2c53aa7e21de4/device-proxy-0.4.3.tar.gz" } ] }