From 30ccfd165701e080f5920f136bba5896a95031de Mon Sep 17 00:00:00 2001 From: Cellebyte Date: Wed, 7 Oct 2020 11:14:35 +0200 Subject: [PATCH 01/10] added python 3 support --- Dockerfile | 19 +++++++++---------- requestbin/__init__.py | 11 +++++------ requestbin/config.py | 3 ++- requestbin/db.py | 2 +- requestbin/storage/memory.py | 3 +-- requirements.txt | 4 +--- 6 files changed, 19 insertions(+), 23 deletions(-) diff --git a/Dockerfile b/Dockerfile index 49461b7..1eda5c6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,16 +1,14 @@ -FROM python:2.7-alpine +FROM python:3.8-alpine RUN apk update && apk upgrade && \ apk add \ - gcc python python-dev py-pip \ - # greenlet - musl-dev \ - # sys/queue.h - bsd-compat-headers \ - # event.h - libevent-dev \ - && rm -rf /var/cache/apk/* - + build-base \ + py3-gevent \ + py3-greenlet \ + libffi-dev \ + # file + file \ + && rm -rf /var/cache/apk/* # want all dependencies first so that if it's just a code change, don't have to # rebuild as much of the container ADD requirements.txt /opt/requestbin/ @@ -23,6 +21,7 @@ ADD requestbin /opt/requestbin/requestbin/ EXPOSE 8000 WORKDIR /opt/requestbin +ENV PYTHONPATH=/usr/lib/python3.8/site-packages CMD gunicorn -b 0.0.0.0:8000 --worker-class gevent --workers 2 --max-requests 1000 requestbin:app diff --git a/requestbin/__init__.py b/requestbin/__init__.py index b7e978a..9ecf5a6 100644 --- a/requestbin/__init__.py +++ b/requestbin/__init__.py @@ -1,6 +1,6 @@ -import config +import requestbin.config as config import os -from cStringIO import StringIO +from io import BytesIO from flask import Flask from flask_cors import CORS @@ -17,7 +17,7 @@ def __call__(self, environ, start_response): body = environ['wsgi.input'].read(length) environ['raw'] = body - environ['wsgi.input'] = StringIO(body) + environ['wsgi.input'] = BytesIO(body) # Call the wrapped application app_iter = self.application(environ, self._sr_callback(start_response)) @@ -38,8 +38,7 @@ def callback(status, headers, exc_info=None): if os.environ.get('ENABLE_CORS', config.ENABLE_CORS): cors = CORS(app, resources={r"*": {"origins": os.environ.get('CORS_ORIGINS', config.CORS_ORIGINS)}}) - -from werkzeug.contrib.fixers import ProxyFix +from werkzeug.middleware.proxy_fix import ProxyFix app.wsgi_app = WSGIRawBody(ProxyFix(app.wsgi_app)) app.debug = config.DEBUG @@ -59,7 +58,7 @@ def callback(status, headers, exc_info=None): ) handle_exceptions(app) -from filters import * +from requestbin.filters import * app.jinja_env.filters['status_class'] = status_class app.jinja_env.filters['friendly_time'] = friendly_time app.jinja_env.filters['friendly_size'] = friendly_size diff --git a/requestbin/config.py b/requestbin/config.py index fa1c862..9629972 100644 --- a/requestbin/config.py +++ b/requestbin/config.py @@ -1,4 +1,5 @@ -import os, urlparse +import os +import urllib.parse as urlparse DEBUG = True REALM = os.environ.get('REALM', 'local') diff --git a/requestbin/db.py b/requestbin/db.py index e1ca0be..1449ba0 100644 --- a/requestbin/db.py +++ b/requestbin/db.py @@ -10,7 +10,7 @@ try: klass = getattr(__import__(storage_module, fromlist=[storage_class]), storage_class) -except ImportError, e: +except ImportError as e: raise ImportError("Unable to load storage backend '{}': {}".format(storage_backend, e)) db = klass(bin_ttl) diff --git a/requestbin/storage/memory.py b/requestbin/storage/memory.py index 8e8f54b..cb41b8e 100644 --- a/requestbin/storage/memory.py +++ b/requestbin/storage/memory.py @@ -1,6 +1,5 @@ import time import operator - from ..models import Bin from requestbin import config @@ -18,7 +17,7 @@ def do_start(self): def _cleanup_loop(self): while True: - self.async.sleep(self.cleanup_interval) + self.asynchronous.sleep(self.cleanup_interval) self._expire_bins() def _expire_bins(self): diff --git a/requirements.txt b/requirements.txt index 09ef285..5ea2ac8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,12 +1,10 @@ -gevent ProxyTypes nose -wsgiref feedparser Flask-Cors redis msgpack-python python-dateutil -gunicorn +gunicorn==19.9.0 bugsnag blinker From 4e4d39915c716488d9a9c5ec2b170e665dd84134 Mon Sep 17 00:00:00 2001 From: Cellebyte Date: Wed, 7 Oct 2020 14:18:37 +0200 Subject: [PATCH 02/10] Fixed requestbin to run on python3 and new new libraries --- .gitignore | 1 + Pipfile | 25 ++ Pipfile.lock | 363 +++++++++++++++++++++ requestbin/__init__.py | 102 +++--- requestbin/api.py | 12 +- requestbin/app.py | 43 +++ requestbin/db.py | 16 +- requestbin/filters.py | 32 +- requestbin/models.py | 17 +- requestbin/static/img/ico-github.png | Bin 0 -> 21128 bytes requestbin/static/img/logo-runscope-1x.png | Bin 3997 -> 0 bytes requestbin/static/img/logo-runscope-2x.png | Bin 2709 -> 0 bytes requestbin/static/img/runscope-hero.png | Bin 94360 -> 0 bytes requestbin/storage/memory.py | 4 +- requestbin/storage/redis.py | 9 +- requestbin/templates/bin.html | 3 - requestbin/templates/layout.html | 24 +- requestbin/util.py | 15 +- requestbin/views.py | 29 +- web.py | 5 +- 20 files changed, 557 insertions(+), 143 deletions(-) create mode 100644 Pipfile create mode 100644 Pipfile.lock create mode 100644 requestbin/app.py create mode 100644 requestbin/static/img/ico-github.png delete mode 100644 requestbin/static/img/logo-runscope-1x.png delete mode 100644 requestbin/static/img/logo-runscope-2x.png delete mode 100644 requestbin/static/img/runscope-hero.png diff --git a/.gitignore b/.gitignore index 9c2407f..377bb48 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ codekit-config.json # Mac Files **/.DS_Store +**/.vscode \ No newline at end of file diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..52e7d44 --- /dev/null +++ b/Pipfile @@ -0,0 +1,25 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] +gevent = "*" +flake8 = "*" +autopep8 = "*" +gunicorn = "*" + +[packages] +nose = "*" +feedparser = "*" +redis = "*" +msgpack-python = "*" +python-dateutil = "*" +gunicorn = "==19.9.0" +bugsnag = "*" +blinker = "*" +ProxyTypes = "*" +Flask-Cors = "*" + +[requires] +python_version = "3.8" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..a3fe60b --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,363 @@ +{ + "_meta": { + "hash": { + "sha256": "11b1390cf97ccb619fb8c87fa3c90300fa935bf2951b66a359c51123c7508e77" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.8" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "blinker": { + "hashes": [ + "sha256:471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6" + ], + "index": "pypi", + "version": "==1.4" + }, + "bugsnag": { + "hashes": [ + "sha256:01c2186f6c2a6f801b66d8fc73b8986bd2d4931a6ab40b720e5fd0b66757facc", + "sha256:d708b091c230fdf007eb0f49d1c71c81da27965d3d56adf690b90c259e179aa9" + ], + "index": "pypi", + "version": "==4.0.1" + }, + "click": { + "hashes": [ + "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a", + "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==7.1.2" + }, + "feedparser": { + "hashes": [ + "sha256:6ca88edcaa43f428345968df903a87f020843eda5e28d7ea24a612158d61e74c", + "sha256:c9b436334258e718e224c5ef8a78088557e0d0382506360f702de10667ffde32" + ], + "index": "pypi", + "version": "==6.0.1" + }, + "flask": { + "hashes": [ + "sha256:4efa1ae2d7c9865af48986de8aeb8504bf32c7f3d6fdc9353d34b21f4b127060", + "sha256:8a4fdd8936eba2512e9c85df320a37e694c93945b33ef33c89946a340a238557" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==1.1.2" + }, + "flask-cors": { + "hashes": [ + "sha256:6bcfc100288c5d1bcb1dbb854babd59beee622ffd321e444b05f24d6d58466b8", + "sha256:cee4480aaee421ed029eaa788f4049e3e26d15b5affb6a880dade6bafad38324" + ], + "index": "pypi", + "version": "==3.0.9" + }, + "gunicorn": { + "hashes": [ + "sha256:aa8e0b40b4157b36a5df5e599f45c9c76d6af43845ba3b3b0efe2c70473c2471", + "sha256:fa2662097c66f920f53f70621c6c58ca4a3c4d3434205e608e121b5b3b71f4f3" + ], + "index": "pypi", + "version": "==19.9.0" + }, + "itsdangerous": { + "hashes": [ + "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19", + "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.1.0" + }, + "jinja2": { + "hashes": [ + "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0", + "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==2.11.2" + }, + "markupsafe": { + "hashes": [ + "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", + "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161", + "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235", + "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5", + "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42", + "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff", + "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b", + "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1", + "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e", + "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183", + "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66", + "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b", + "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1", + "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15", + "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1", + "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e", + "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b", + "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905", + "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735", + "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d", + "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e", + "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d", + "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c", + "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21", + "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2", + "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5", + "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b", + "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6", + "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f", + "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f", + "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2", + "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7", + "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.1.1" + }, + "msgpack-python": { + "hashes": [ + "sha256:378cc8a6d3545b532dfd149da715abae4fda2a3adb6d74e525d0d5e51f46909b" + ], + "index": "pypi", + "version": "==0.5.6" + }, + "nose": { + "hashes": [ + "sha256:9ff7c6cc443f8c51994b34a667bbcf45afd6d945be7477b52e97516fd17c53ac", + "sha256:dadcddc0aefbf99eea214e0f1232b94f2fa9bd98fa8353711dacb112bfcbbb2a", + "sha256:f1bffef9cbc82628f6e7d7b40d7e255aefaa1adb6a1b1d26c69a8b79e6208a98" + ], + "index": "pypi", + "version": "==1.3.7" + }, + "proxytypes": { + "hashes": [ + "sha256:82cc41d5e7c913982b505241c7c87448ed26b6884a40c2889f2ee19d06339985", + "sha256:83e5bb089cccb23087c6e3c5d71dda9fca351b624ca5de709fddcf58dab84c84", + "sha256:f3bf78debafe15d8ccb31a0c909f820408bb678532a8be8bf737ddd50c03f298" + ], + "index": "pypi", + "version": "==0.10.0" + }, + "python-dateutil": { + "hashes": [ + "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c", + "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a" + ], + "index": "pypi", + "version": "==2.8.1" + }, + "redis": { + "hashes": [ + "sha256:0e7e0cfca8660dea8b7d5cd8c4f6c5e29e11f31158c0b0ae91a397f00e5a05a2", + "sha256:432b788c4530cfe16d8d943a09d40ca6c16149727e4afe8c2c9d5580c59d9f24" + ], + "index": "pypi", + "version": "==3.5.3" + }, + "sgmllib3k": { + "hashes": [ + "sha256:7868fb1c8bfa764c1ac563d3cf369c381d1325d36124933a726f29fcdaa812e9" + ], + "version": "==1.0.0" + }, + "six": { + "hashes": [ + "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", + "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.15.0" + }, + "webob": { + "hashes": [ + "sha256:a3c89a8e9ba0aeb17382836cdb73c516d0ecf6630ec40ec28288f3ed459ce87b", + "sha256:aa3a917ed752ba3e0b242234b2a373f9c4e2a75d35291dcbe977649bd21fd108" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.8.6" + }, + "werkzeug": { + "hashes": [ + "sha256:2de2a5db0baeae7b2d2664949077c2ac63fbd16d98da0ff71837f7d1dea3fd43", + "sha256:6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==1.0.1" + } + }, + "develop": { + "autopep8": { + "hashes": [ + "sha256:d21d3901cb0da6ebd1e83fc9b0dfbde8b46afc2ede4fe32fbda0c7c6118ca094" + ], + "index": "pypi", + "version": "==1.5.4" + }, + "flake8": { + "hashes": [ + "sha256:749dbbd6bfd0cf1318af27bf97a14e28e5ff548ef8e5b1566ccfb25a11e7c839", + "sha256:aadae8761ec651813c24be05c6f7b4680857ef6afaae4651a4eccaef97ce6c3b" + ], + "index": "pypi", + "version": "==3.8.4" + }, + "gevent": { + "hashes": [ + "sha256:10110d4881aec04f218c316cb796b18c8b2cac67ae0eb5b0c5780056757268a2", + "sha256:1628a403fc9c3ea9b35924638a4d4fbe236f60ecdf4e22ed133fbbaf0bc7cb6b", + "sha256:1cfa3674866294623e324fa5b76eba7b96744d1956a605cfe24d26c5cd890f91", + "sha256:2269574444113cb4ca1c1808ab9460a87fe25e1c34a6e36d975d4af46e4afff9", + "sha256:283a021a2e14adfad718346f18982b80569d9c3a59e97cfae1b7d4c5b017941a", + "sha256:2aa70726ad1883fe7c17774e5ccc91ac6e30334efa29bafb9b8fe8ca6091b219", + "sha256:315a63a35068183dfb9bc0331c7bb3c265ee7db8a11797cbe98dadbdb45b5d35", + "sha256:324808a8558c733f7a9734525483795d52ca3bbd5662b24b361d81c075414b1f", + "sha256:33a63f230755c6813fca39d9cea2a8894df32df2ee58fd69d8bf8fcc1d8e018e", + "sha256:5f6d48051d336561ec08995431ee4d265ac723a64bba99cc58c3eb1a4d4f5c8d", + "sha256:8d338cd6d040fe2607e5305dd7991b5960b3780ae01f804c2ac5760d31d3b2c6", + "sha256:906175e3fb25f377a0b581e79d3ed5a7d925c136ff92fd022bb3013e25f5f3a9", + "sha256:93980e51dd2e5f81899d644a0b6ef4a73008c679fcedd50e3b21cc3451ba2424", + "sha256:9bb477f514cf39dc20651b479bf1ad4f38b9a679be2bfa3e162ec0c3785dfa2a", + "sha256:a8733a01974433d91308f8c44fa6cc13428b15bb39d46540657e260ff8852cb1", + "sha256:adbb267067f56696b2babced3d0856aa39dcf14b8ccd2dffa1fab587b00c6f80", + "sha256:afc177c37de41ce9c27d351ac84cbaf34407effcab5d6641645838f39d365be1", + "sha256:b07fcbca3e819296979d82fac3d8b44f0d5ced57b9a04dffcfd194da99c8eb2d", + "sha256:b2948566003a1030e47507755fe1f446995e8671c0c67571091539e01faf94cc", + "sha256:db208e74a32cff7f55f5aa1ba5d7d1c1a086a6325c8702ae78a5c741155552ff", + "sha256:dd4c6b2f540b25c3d0f277a725bc1a900ce30a681b90a081216e31f814be453b", + "sha256:e11de4b4d107ca2f35000eb08e9c4c4621c153103b400f48a9ea95b96d8c7e0b", + "sha256:eba19bae532d0c48d489fa16815b242ce074b1f4b63e8a8e663232cbe311ead9", + "sha256:fb33dc1ab27557bccd64ad4bf81e68c8b0d780fe937b1e2c0814558798137229" + ], + "index": "pypi", + "version": "==20.9.0" + }, + "greenlet": { + "hashes": [ + "sha256:1023d7b43ca11264ab7052cb09f5635d4afdb43df55e0854498fc63070a0b206", + "sha256:124a3ae41215f71dc91d1a3d45cbf2f84e46b543e5d60b99ecc20e24b4c8f272", + "sha256:13037e2d7ab2145300676852fa069235512fdeba4ed1e3bb4b0677a04223c525", + "sha256:3af587e9813f9bd8be9212722321a5e7be23b2bc37e6323a90e592ab0c2ef117", + "sha256:41d8835c69a78de718e466dd0e6bfd4b46125f21a67c3ff6d76d8d8059868d6b", + "sha256:4481002118b2f1588fa3d821936ffdc03db80ef21186b62b90c18db4ba5e743b", + "sha256:47825c3a109f0331b1e54c1173d4e57fa000aa6c96756b62852bfa1af91cd652", + "sha256:5494e3baeacc371d988345fbf8aa4bd15555b3077c40afcf1994776bb6d77eaf", + "sha256:75e4c27188f28149b74e7685809f9227410fd15432a4438fc48627f518577fa5", + "sha256:97f2b01ab622a4aa4b3724a3e1fba66f47f054c434fbaa551833fa2b41e3db51", + "sha256:a34023b9eabb3525ee059f3bf33a417d2e437f7f17e341d334987d4091ae6072", + "sha256:ac85db59aa43d78547f95fc7b6fd2913e02b9e9b09e2490dfb7bbdf47b2a4914", + "sha256:be7a79988b8fdc5bbbeaed69e79cfb373da9759242f1565668be4fb7f3f37552", + "sha256:bee111161420f341a346731279dd976be161b465c1286f82cc0779baf7b729e8", + "sha256:ccd62f09f90b2730150d82f2f2ffc34d73c6ce7eac234aed04d15dc8a3023994", + "sha256:d3436110ca66fe3981031cc6aff8cc7a40d8411d173dde73ddaa5b8445385e2d", + "sha256:e495096e3e2e8f7192afb6aaeba19babc4fb2bdf543d7b7fed59e00c1df7f170", + "sha256:e66a824f44892bc4ec66c58601a413419cafa9cec895e63d8da889c8a1a4fa4a" + ], + "markers": "platform_python_implementation == 'CPython'", + "version": "==0.4.17" + }, + "gunicorn": { + "hashes": [ + "sha256:aa8e0b40b4157b36a5df5e599f45c9c76d6af43845ba3b3b0efe2c70473c2471", + "sha256:fa2662097c66f920f53f70621c6c58ca4a3c4d3434205e608e121b5b3b71f4f3" + ], + "index": "pypi", + "version": "==19.9.0" + }, + "mccabe": { + "hashes": [ + "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", + "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" + ], + "version": "==0.6.1" + }, + "pycodestyle": { + "hashes": [ + "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367", + "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.6.0" + }, + "pyflakes": { + "hashes": [ + "sha256:0d94e0e05a19e57a99444b6ddcf9a6eb2e5c68d3ca1e98e90707af8152c90a92", + "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.2.0" + }, + "toml": { + "hashes": [ + "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f", + "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88" + ], + "version": "==0.10.1" + }, + "zope.event": { + "hashes": [ + "sha256:2666401939cdaa5f4e0c08cf7f20c9b21423b95e88f4675b1443973bdb080c42", + "sha256:5e76517f5b9b119acf37ca8819781db6c16ea433f7e2062c4afc2b6fbedb1330" + ], + "version": "==4.5.0" + }, + "zope.interface": { + "hashes": [ + "sha256:040f833694496065147e76581c0bf32b229a8b8c5eda120a0293afb008222387", + "sha256:11198b44e4a3d8c7a80cc20bbdd65522258a4d82fe467cd310c9fcce8ffe2ed2", + "sha256:121a9dccfe0c34be9c33b2c28225f0284f9b8e090580ffdff26c38fa16c7ffe1", + "sha256:15f3082575e7e19581a80b866664f843719b647a7f7189c811ba7f9ab3309f83", + "sha256:1d73d8986f948525536956ddd902e8a587a6846ebf4492117db16daba2865ddf", + "sha256:208e82f73b242275b8566ac07a25158e7b21fa2f14e642a7881048430612d1a6", + "sha256:2557833df892558123d791d6ff80ac4a2a0351f69c7421c7d5f0c07db72c8865", + "sha256:25ea6906f9987d42546329d06f9750e69f0ee62307a2e7092955ed0758e64f09", + "sha256:2c867914f7608674a555ac8daf20265644ac7be709e1da7d818089eebdfe544e", + "sha256:2eadac20711a795d3bb7a2bfc87c04091cb5274d9c3281b43088a1227099b662", + "sha256:37999d5ebd5d7bcd32438b725ca3470df05a7de8b1e9c0395bef24296b31ca99", + "sha256:3ae8946d51789779f76e4fa326fd6676d8c19c1c3b4c4c5e9342807185264875", + "sha256:5636cd7e60583b1608044ae4405e91575399430e66a5e1812f4bf30bcc55864e", + "sha256:570e637cb6509998555f7e4af13006d89fad6c09cfc5c4795855385391063e4b", + "sha256:590a40447ff3803c44050ce3c17c3958f11ca028dae3eacdd7b96775184394fa", + "sha256:5aab51b9c1af1b8a84f40aa49ffe1684d41810b18d6c3e94aa50194e0a563f01", + "sha256:5ffe4e0753393bcbcfc9a58133ed3d3a584634cc7cc2e667f8e3e6fbcbb2155d", + "sha256:663982381bd428a275a841009e52983cc69c471a4979ce01344fadbf72cf353d", + "sha256:6d06bf8e24dd6c473c4fbd8e16a83bd2e6d74add6ba25169043deb46d497b211", + "sha256:6e5b9a4bf133cf1887b4a04c21c10ca9f548114f19c83957b2820d5c84254940", + "sha256:70a2aed9615645bbe9d82c0f52bc7e676d2c0f8a63933d68418e0cb307f30536", + "sha256:7750746421c4395e3d2cc3d805919f4f57bb9f2a9a0ccd955566a9341050a1b4", + "sha256:7fc8708bc996e50fc7a9a2ad394e1f015348e389da26789fa6916630237143d7", + "sha256:91abd2f080065a7c007540f6bbd93ef7bdbbffa6df4a4cfab3892d8623b83c98", + "sha256:988f8b2281f3d95c66c01bdb141cefef1cc97db0d473c25c3fe2927ef00293b9", + "sha256:9f56121d8a676802044584e6cc41250bbcde069d8adf725b9b817a6b0fd87f09", + "sha256:a0f51536ce6e817a7aa25b0dca8b62feb210d4dc22cabfe8d1a92d47979372cd", + "sha256:a1cdd7390d7f66ddcebf545203ca3728c4890d605f9f2697bc8e31437906e8e7", + "sha256:b10eb4d0a77609679bf5f23708e20b1cd461a1643bd8ea42b1ca4149b1a5406c", + "sha256:b274ac8e511b55ffb62e8292316bd2baa80c10e9fe811b1aa5ce81da6b6697d8", + "sha256:c75b502af2c83fcfa2ee9c2257c1ba5806634a91a50db6129ff70e67c42c7e7b", + "sha256:c9c8e53a5472b77f6a391b515c771105011f4b40740ce53af8428d1c8ca20004", + "sha256:d867998a56c5133b9d31992beb699892e33b72150a8bf40f86cb52b8c606c83f", + "sha256:eb566cab630ec176b2d6115ed08b2cf4d921b47caa7f02cca1b4a9525223ee94", + "sha256:f61e6b95b414431ffe9dc460928fe9f351095fde074e2c2f5c6dda7b67a2192d", + "sha256:f718675fd071bcce4f7cbf9250cbaaf64e2e91ef1b0b32a1af596e7412647556", + "sha256:f9d4bfbd015e4b80dbad11c97049975f94592a6a0440e903ee647309f6252a1f", + "sha256:fae50fc12a5e8541f6f1cc4ed744ca8f76a9543876cf63f618fb0e6aca8f8375", + "sha256:fcf9c8edda7f7b2fd78069e97f4197815df5e871ec47b0f22580d330c6dec561", + "sha256:fdedce3bc5360bd29d4bb90396e8d4d3c09af49bc0383909fe84c7233c5ee675" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==5.1.2" + } + } +} diff --git a/requestbin/__init__.py b/requestbin/__init__.py index 9ecf5a6..502a9d6 100644 --- a/requestbin/__init__.py +++ b/requestbin/__init__.py @@ -1,10 +1,58 @@ -import requestbin.config as config import os from io import BytesIO - from flask import Flask from flask_cors import CORS +import requestbin.config as config +from requestbin.filters import (approximate_time, exact_time, friendly_size, + friendly_time, short_date, status_class, to_qs) +from werkzeug.middleware.proxy_fix import ProxyFix + + +class MyApplication(Flask): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.wsgi_app = WSGIRawBody(ProxyFix(self.wsgi_app)) + self.add_config() + self.add_filters() + + def add_config(self): + self.debug = config.DEBUG + self.secret_key = config.FLASK_SESSION_SECRET_KEY + self.root_path = os.path.abspath(os.path.dirname(__file__)) + if config.BUGSNAG_KEY: + import bugsnag + from bugsnag.flask import handle_exceptions + bugsnag.configure( + api_key=config.BUGSNAG_KEY, + project_root=self.root_path, + # 'production' is a magic string for bugsnag, rest are arbitrary + release_stage=config.REALM.replace("prod", "production"), + notify_release_stages=["production", "test"], + use_ssl=True + ) + handle_exceptions(self) + if os.environ.get('ENABLE_CORS', config.ENABLE_CORS): + _ = CORS( + self, + resources={ + r"*": { + "origins": os.environ.get( + 'CORS_ORIGINS', config.CORS_ORIGINS + ) + } + } + ) + + def add_filters(self): + self.jinja_env.filters['status_class'] = status_class + self.jinja_env.filters['friendly_time'] = friendly_time + self.jinja_env.filters['friendly_size'] = friendly_size + self.jinja_env.filters['to_qs'] = to_qs + self.jinja_env.filters['approximate_time'] = approximate_time + self.jinja_env.filters['exact_time'] = exact_time + self.jinja_env.filters['short_date'] = short_date + class WSGIRawBody(object): def __init__(self, application): @@ -31,53 +79,3 @@ def callback(status, headers, exc_info=None): # Call upstream start_response start_response(status, headers, exc_info) return callback - - - -app = Flask(__name__) - -if os.environ.get('ENABLE_CORS', config.ENABLE_CORS): - cors = CORS(app, resources={r"*": {"origins": os.environ.get('CORS_ORIGINS', config.CORS_ORIGINS)}}) -from werkzeug.middleware.proxy_fix import ProxyFix -app.wsgi_app = WSGIRawBody(ProxyFix(app.wsgi_app)) - -app.debug = config.DEBUG -app.secret_key = config.FLASK_SESSION_SECRET_KEY -app.root_path = os.path.abspath(os.path.dirname(__file__)) - -if config.BUGSNAG_KEY: - import bugsnag - from bugsnag.flask import handle_exceptions - bugsnag.configure( - api_key=config.BUGSNAG_KEY, - project_root=app.root_path, - # 'production' is a magic string for bugsnag, rest are arbitrary - release_stage = config.REALM.replace("prod", "production"), - notify_release_stages=["production", "test"], - use_ssl = True - ) - handle_exceptions(app) - -from requestbin.filters import * -app.jinja_env.filters['status_class'] = status_class -app.jinja_env.filters['friendly_time'] = friendly_time -app.jinja_env.filters['friendly_size'] = friendly_size -app.jinja_env.filters['to_qs'] = to_qs -app.jinja_env.filters['approximate_time'] = approximate_time -app.jinja_env.filters['exact_time'] = exact_time -app.jinja_env.filters['short_date'] = short_date - -app.add_url_rule('/', 'views.home') -app.add_url_rule('/', 'views.bin', methods=['GET', 'POST', 'DELETE', 'PUT', 'OPTIONS', 'HEAD', 'PATCH', 'TRACE']) - -app.add_url_rule('/docs/', 'views.docs') -app.add_url_rule('/api/v1/bins', 'api.bins', methods=['POST']) -app.add_url_rule('/api/v1/bins/', 'api.bin', methods=['GET']) -app.add_url_rule('/api/v1/bins//requests', 'api.requests', methods=['GET']) -app.add_url_rule('/api/v1/bins//requests/', 'api.request', methods=['GET']) - -app.add_url_rule('/api/v1/stats', 'api.stats') - -# app.add_url_rule('/robots.txt', redirect_to=url_for('static', filename='robots.txt')) - -from requestbin import api, views diff --git a/requestbin/api.py b/requestbin/api.py index 2a83065..b818b78 100644 --- a/requestbin/api.py +++ b/requestbin/api.py @@ -1,8 +1,9 @@ import json -import operator -from flask import session, make_response, request, render_template -from requestbin import app, db +from flask import make_response, request, session + +from requestbin import db + def _response(object, code=200): jsonp = request.args.get('jsonp') @@ -16,7 +17,6 @@ def _response(object, code=200): return resp -@app.endpoint('api.bins') def bins(): private = request.form.get('private') in ['true', 'on'] bin = db.create_bin(private) @@ -25,7 +25,6 @@ def bins(): return _response(bin.to_dict()) -@app.endpoint('api.bin') def bin(name): try: bin = db.lookup_bin(name) @@ -35,7 +34,6 @@ def bin(name): return _response(bin.to_dict()) -@app.endpoint('api.requests') def requests(bin): try: bin = db.lookup_bin(bin) @@ -45,7 +43,6 @@ def requests(bin): return _response([r.to_dict() for r in bin.requests]) -@app.endpoint('api.request') def request_(bin, name): try: bin = db.lookup_bin(bin) @@ -59,7 +56,6 @@ def request_(bin, name): return _response({'error': "Request not found"}, 404) -@app.endpoint('api.stats') def stats(): stats = { 'bin_count': db.count_bins(), diff --git a/requestbin/app.py b/requestbin/app.py new file mode 100644 index 0000000..816cfd2 --- /dev/null +++ b/requestbin/app.py @@ -0,0 +1,43 @@ +from requestbin import MyApplication +import requestbin.views as views +import requestbin.api as api + + +app = MyApplication(__name__) + +app.add_url_rule('/', 'views.home', views.home) +views.bin.methods = [ + 'GET', + 'POST', + 'DELETE', + 'PUT', + 'OPTIONS', + 'HEAD', + 'PATCH', + 'TRACE' +] +app.add_url_rule('/', 'views.bin', views.bin) +app.add_url_rule('/docs/', 'views.docs', views.docs) + +api.bins.provide_automatic_options = False +api.bins.methods = ['POST'] +app.add_url_rule( + '/api/v1/bins', 'api.bins', api.bins) + +api.bin.provide_automatic_options = False +api.bin.methods = ['GET'] +app.add_url_rule( + '/api/v1/bins/', 'api.bin', api.bin) + +api.requests.provide_automatic_options = False +api.requests.methods = ['GET'] +app.add_url_rule('/api/v1/bins//requests', + 'api.requests', api.requests, methods=['GET']) + + +api.request_.provide_automatic_options = False +api.request_.methods = ['GET'] +app.add_url_rule('/api/v1/bins//requests/', 'api.request_', api.request_) + + +app.add_url_rule('/api/v1/stats', 'api.stats', api.stats) diff --git a/requestbin/db.py b/requestbin/db.py index 1449ba0..378fc58 100644 --- a/requestbin/db.py +++ b/requestbin/db.py @@ -1,5 +1,3 @@ -import feedparser -import time import re from requestbin import config @@ -9,27 +7,35 @@ storage_module, storage_class = storage_backend.rsplit('.', 1) try: - klass = getattr(__import__(storage_module, fromlist=[storage_class]), storage_class) + klass = getattr(__import__(storage_module, fromlist=[ + storage_class]), storage_class) except ImportError as e: - raise ImportError("Unable to load storage backend '{}': {}".format(storage_backend, e)) + raise ImportError( + "Unable to load storage backend '{}': {}".format(storage_backend, e)) db = klass(bin_ttl) + def create_bin(private=False): return db.create_bin(private) + def create_request(bin, request): return db.create_request(bin, request) + def lookup_bin(name): - name=re.split(r"[/.]", name)[0] + name = re.split(r"[/.]", name)[0] return db.lookup_bin(name) + def count_bins(): return db.count_bins() + def count_requests(): return db.count_requests() + def avg_req_size(): return db.avg_req_size() diff --git a/requestbin/filters.py b/requestbin/filters.py index a9b51c5..944ffb6 100644 --- a/requestbin/filters.py +++ b/requestbin/filters.py @@ -1,12 +1,10 @@ import datetime from dateutil.parser import parse -import hashlib -import os import time -import urllib + def approximate_time(ts): - if not isinstance(ts, (int, long, float, complex)): + if not isinstance(ts, (int, float, complex)): return "" now = time.time() @@ -44,11 +42,11 @@ def friendly_size(bytes): def status_class(status_code): status_code = str(status_code or "0") lookup = { - "0" : "", - "2" : "ok", - "3" : "info", - "4" : "warning", - "5" : "error" + "0": "", + "2": "ok", + "3": "info", + "4": "warning", + "5": "error" } return lookup.get(status_code[0], "") @@ -71,20 +69,20 @@ def friendly_time(secs): def friendly_number(input): - if not isinstance(input, (int, long, float, complex)): + if not isinstance(input, (int, float, complex)): return "" return "{:,}".format(input) def exact_time(ts): - if not isinstance(ts, (int, long, float, complex)): + if not isinstance(ts, (int, float, complex)): return None return datetime.datetime.utcfromtimestamp(ts) def time_class(secs): - if not isinstance(secs, (int, long, float, complex)): + if not isinstance(secs, (int, float, complex)): return "" ms = secs * 1000.0 @@ -92,7 +90,7 @@ def time_class(secs): return "error" if ms > 1000: - return "warning" + return "warning" return "" @@ -112,14 +110,14 @@ def to_qs(params_dict): qs = qs + u"{}={}".format(k, v) return qs - + def short_date(input): dt = None - if isinstance(input, (str, unicode)): + if isinstance(input, (str)): dt = parse(input) - elif isinstance(input, (int, long, float, complex)): + elif isinstance(input, (int, float, complex)): dt = datetime.datetime.utcfromtimestamp(float(input)) else: return "" - return dt.strftime("%b %d, %Y") \ No newline at end of file + return dt.strftime("%b %d, %Y") diff --git a/requestbin/models.py b/requestbin/models.py index 69322ae..7fa2a28 100644 --- a/requestbin/models.py +++ b/requestbin/models.py @@ -3,7 +3,6 @@ import time import datetime import os -import re import logging import msgpack @@ -14,6 +13,7 @@ from requestbin import config + class Bin(object): max_requests = config.MAX_REQUESTS @@ -28,11 +28,11 @@ def __init__(self, private=False): def json(self): return json.dumps(self.to_dict()) - + def to_dict(self): return dict( - private=self.private, - color=self.color, + private=self.private, + color=self.color, name=self.name, request_count=self.request_count) @@ -62,13 +62,14 @@ def add(self, request): class Request(object): ignore_headers = config.IGNORE_HEADERS - max_raw_size = config.MAX_RAW_SIZE + max_raw_size = config.MAX_RAW_SIZE def __init__(self, input=None): if input: self.id = tinyid(6) self.time = time.time() - self.remote_addr = input.headers.get('X-Forwarded-For', input.remote_addr) + self.remote_addr = input.headers.get( + 'X-Forwarded-For', input.remote_addr) self.method = input.method self.headers = dict(input.headers) @@ -89,12 +90,11 @@ def __init__(self, input=None): self.content_length = len(self.raw) # for header in self.ignore_headers: - # self.raw = re.sub(r'{}: [^\n]+\n'.format(header), + # self.raw = re.sub(r'{}: [^\n]+\n'.format(header), # '', self.raw, flags=re.IGNORECASE) if self.raw and len(self.raw) > self.max_raw_size: self.raw = self.raw[0:self.max_raw_size] - def to_dict(self): return dict( id=self.id, @@ -168,4 +168,3 @@ def load(data): # else: # fields.append((k,v)) # return iter(sorted(fields) + sorted(files)) - diff --git a/requestbin/static/img/ico-github.png b/requestbin/static/img/ico-github.png new file mode 100644 index 0000000000000000000000000000000000000000..12b4fb0b2321babedfd999fbbcea5330b3dad9dc GIT binary patch literal 21128 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 DdGfO- diff --git a/requestbin/static/img/logo-runscope-2x.png b/requestbin/static/img/logo-runscope-2x.png deleted file mode 100644 index 4c6a85c0705e4fa35f03d559ccfc80033a7f1779..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2709 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

U1 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 diff --git a/requestbin/storage/memory.py b/requestbin/storage/memory.py index cb41b8e..08da83f 100644 --- a/requestbin/storage/memory.py +++ b/requestbin/storage/memory.py @@ -1,9 +1,10 @@ import time -import operator from ..models import Bin + from requestbin import config + class MemoryStorage(): cleanup_interval = config.CLEANUP_INTERVAL @@ -17,6 +18,7 @@ def do_start(self): def _cleanup_loop(self): while True: + print(dir(self)) self.asynchronous.sleep(self.cleanup_interval) self._expire_bins() diff --git a/requestbin/storage/redis.py b/requestbin/storage/redis.py index ae0df9a..8207bf7 100644 --- a/requestbin/storage/redis.py +++ b/requestbin/storage/redis.py @@ -1,20 +1,19 @@ from __future__ import absolute_import -import time -import cPickle as pickle - import redis from ..models import Bin from requestbin import config + class RedisStorage(): prefix = config.REDIS_PREFIX def __init__(self, bin_ttl): self.bin_ttl = bin_ttl - self.redis = redis.StrictRedis(host=config.REDIS_HOST, port=config.REDIS_PORT, db=config.REDIS_DB, password=config.REDIS_PASSWORD) + self.redis = redis.StrictRedis( + host=config.REDIS_HOST, port=config.REDIS_PORT, db=config.REDIS_DB, password=config.REDIS_PASSWORD) def _key(self, name): return '{}_{}'.format(self.prefix, name) @@ -56,5 +55,5 @@ def lookup_bin(self, name): bin = Bin.load(serialized_bin) return bin except TypeError: - self.redis.delete(key) # clear bad data + self.redis.delete(key) # clear bad data raise KeyError("Bin not found") diff --git a/requestbin/templates/bin.html b/requestbin/templates/bin.html index c423bdb..4d6ac6b 100644 --- a/requestbin/templates/bin.html +++ b/requestbin/templates/bin.html @@ -142,9 +142,6 @@

Limits

This {% if bin.private %}private{% endif %} bin will keep the last {{MAX_REQUESTS}} requests made to it and remain available for {{BIN_TTL}} hours after it was created. However, data might be cleared at any time, so treat bins as highly ephemeral.

- -

Need more?

-

Sign up for a free Runscope account. Runscope request captures give you live updates, permanent URLs, file handling and much more.

{% endblock %} diff --git a/requestbin/templates/layout.html b/requestbin/templates/layout.html index 3229505..759f2e4 100644 --- a/requestbin/templates/layout.html +++ b/requestbin/templates/layout.html @@ -16,14 +16,13 @@
-

A Runscope community project. Send us feedback!

+

A project on GitHub

- RequestBin

diff --git a/requestbin/util.py b/requestbin/util.py index 4a56c25..07fb9a8 100644 --- a/requestbin/util.py +++ b/requestbin/util.py @@ -2,23 +2,28 @@ import random import base64 + def random_byte(gradient=None, floor=0): factor = gradient or 1 max = int(255 / factor) return random.randint(floor, max) * factor -def solid16x16gif_datauri(r,g,b): + +def solid16x16gif_datauri(r, g, b): return "data:image/gif;base64,R0lGODlhEAAQAIAA%sACH5BAQAAAAALAAAAAAQABAAAAIOhI+py+0Po5y02ouzPgUAOw==" \ - % base64.b64encode(bytearray([0,r,g,b,0,0])) + % base64.b64encode(bytearray([0, r, g, b, 0, 0])) + def random_color(): return random_byte(10, 5), random_byte(10, 5), random_byte(10, 5) -def baseN(num,b,numerals="0123456789abcdefghijklmnopqrstuvwxyz"): - return ((num == 0) and "0" ) or (baseN(num // b, b).lstrip("0") + numerals[num % b]) + +def baseN(num, b, numerals="0123456789abcdefghijklmnopqrstuvwxyz"): + return ((num == 0) and "0") or (baseN(num // b, b).lstrip("0") + numerals[num % b]) + def tinyid(size=6): id = '%s%s' % ( - baseN(abs(hash(time.time())), 36), + baseN(abs(hash(time.time())), 36), baseN(abs(hash(time.time())), 36)) return id[0:size] diff --git a/requestbin/views.py b/requestbin/views.py index 4c53a15..998d913 100644 --- a/requestbin/views.py +++ b/requestbin/views.py @@ -1,7 +1,8 @@ -import urllib -from flask import session, redirect, url_for, escape, request, render_template, make_response +from flask import make_response, render_template, request, session + +import requestbin.config as config +from requestbin import db -from requestbin import config, app, db def update_recent_bins(name): if 'recent' not in session: @@ -26,40 +27,38 @@ def expand_recent_bins(): session.modified = True return recent -@app.endpoint('views.home') + def home(): return render_template('home.html', recent=expand_recent_bins()) -@app.endpoint('views.bin') def bin(name): try: bin = db.lookup_bin(name) except KeyError: return "Not found\n", 404 - if request.query_string == 'inspect': + if request.query_string.decode() == 'inspect': if bin.private and session.get(bin.name) != bin.secret_key: return "Private bin\n", 403 update_recent_bins(name) return render_template('bin.html', - bin=bin, - base_url=request.scheme+'://'+request.host, - MAX_REQUESTS=config.MAX_REQUESTS, - BIN_TTL=config.BIN_TTL / 3600) + bin=bin, + base_url=request.scheme+'://'+request.host, + MAX_REQUESTS=config.MAX_REQUESTS, + BIN_TTL=config.BIN_TTL / 3600) else: + db.create_request(bin, request) resp = make_response("ok\n") - resp.headers['Sponsored-By'] = "https://www.runscope.com" return resp -@app.endpoint('views.docs') def docs(name): doc = db.lookup_doc(name) if doc: return render_template('doc.html', - content=doc['content'], - title=doc['title'], - recent=expand_recent_bins()) + content=doc['content'], + title=doc['title'], + recent=expand_recent_bins()) else: return "Not found", 404 diff --git a/web.py b/web.py index bd9824f..ff8025f 100644 --- a/web.py +++ b/web.py @@ -1,8 +1,7 @@ from requestbin import config -import os -from requestbin import app +from requestbin.app import app if __name__ == "__main__": port = int(config.PORT) - app.run(host='0.0.0.0', port=port, debug=config.DEBUG) \ No newline at end of file + app.run(host='0.0.0.0', port=port, debug=config.DEBUG) From b1e8d0aaf924e63f71d9126218f9a209e3041612 Mon Sep 17 00:00:00 2001 From: Cellebyte Date: Wed, 7 Oct 2020 14:27:25 +0200 Subject: [PATCH 03/10] Finally make requestbin python3.8 compatible --- app.json | 4 +--- requestbin/static/css/styles.css | 2 +- requestbin/static/less/custom.less | 2 +- requestbin/static/less/styles.less | 2 +- requestbin/templates/layout.html | 2 +- runtime.txt | 2 +- setup.py | 7 +++---- wercker.yml | 2 +- 8 files changed, 10 insertions(+), 13 deletions(-) diff --git a/app.json b/app.json index f114580..dce7288 100644 --- a/app.json +++ b/app.json @@ -1,9 +1,7 @@ { "name": "requestbin", "description": "Inspect HTTP requests. Debug webhooks.", - "website": "http://requestb.in/", - "repository": "https://github.com/Runscope/requestbin", - "logo": "http://requestb.in/static/img/logo-2x.png", + "repository": "https://github.com/cellebyte/requestbin", "keywords": ["python"], "env": { "REALM": { diff --git a/requestbin/static/css/styles.css b/requestbin/static/css/styles.css index c98e0b8..3c1f82e 100644 --- a/requestbin/static/css/styles.css +++ b/requestbin/static/css/styles.css @@ -46,7 +46,7 @@ hr { padding: 4px 12px; color: #ffffff; } -.runscope-wrap { +.formal-wrap { padding: 4px 20px; background: #f9f9f9; border-bottom: 1px solid #eeeeee; diff --git a/requestbin/static/less/custom.less b/requestbin/static/less/custom.less index 098f066..ce27372 100644 --- a/requestbin/static/less/custom.less +++ b/requestbin/static/less/custom.less @@ -7,7 +7,7 @@ // -------------------------------------------------- -// Runscope Colors +// Colors // ------------------------- @rsNavy: #061427; @rsRoyal: #1b70e0; diff --git a/requestbin/static/less/styles.less b/requestbin/static/less/styles.less index 64d59e7..a8fdee6 100644 --- a/requestbin/static/less/styles.less +++ b/requestbin/static/less/styles.less @@ -55,7 +55,7 @@ hr { color: @white; } -.runscope-wrap { +.formal-wrap { padding: 4px 20px; background: @grayLightest; border-bottom: 1px solid @grayLighter; diff --git a/requestbin/templates/layout.html b/requestbin/templates/layout.html index 759f2e4..b5fbdc7 100644 --- a/requestbin/templates/layout.html +++ b/requestbin/templates/layout.html @@ -14,7 +14,7 @@ -
+

A project on GitHub

diff --git a/runtime.txt b/runtime.txt index 5385682..43b47fb 100644 --- a/runtime.txt +++ b/runtime.txt @@ -1 +1 @@ -python-2.7.14 +python-3.8.5 diff --git a/setup.py b/setup.py index 3aa6902..3baf46e 100644 --- a/setup.py +++ b/setup.py @@ -1,12 +1,11 @@ #!/usr/bin/env python -import os from setuptools import setup, find_packages setup( name='requestbin', - version='2.0.0', - author='Runscope', - author_email='requestbin@runscope.com', + version='3.0.0', + author='Cellebyte', + author_email='cellebyte@gmail.com', description='HTTP request collector and inspector', packages=find_packages(), install_requires=['feedparser'], diff --git a/wercker.yml b/wercker.yml index d2450e2..3816140 100644 --- a/wercker.yml +++ b/wercker.yml @@ -1,4 +1,4 @@ -box: python:2.7 +box: python:3.8 services: - redis:2.8 build: From b6c550bc26da6bc96a7885919b82cabfda2d21e4 Mon Sep 17 00:00:00 2001 From: Cellebyte Date: Wed, 7 Oct 2020 14:38:09 +0200 Subject: [PATCH 04/10] Fixed the docker Manifest --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 1eda5c6..990cba8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,6 +22,6 @@ EXPOSE 8000 WORKDIR /opt/requestbin ENV PYTHONPATH=/usr/lib/python3.8/site-packages -CMD gunicorn -b 0.0.0.0:8000 --worker-class gevent --workers 2 --max-requests 1000 requestbin:app +CMD gunicorn -b 0.0.0.0:8000 --worker-class gevent --workers 2 --max-requests 1000 requestbin.app:app From 3c74c8ddcd840e2db2b35a48c8528139ed2856a4 Mon Sep 17 00:00:00 2001 From: Cellebyte Date: Wed, 7 Oct 2020 14:48:26 +0200 Subject: [PATCH 05/10] Removed unused function --- requestbin/app.py | 1 - requestbin/templates/doc.html | 12 ------------ requestbin/views.py | 12 ------------ 3 files changed, 25 deletions(-) delete mode 100644 requestbin/templates/doc.html diff --git a/requestbin/app.py b/requestbin/app.py index 816cfd2..daf08c4 100644 --- a/requestbin/app.py +++ b/requestbin/app.py @@ -17,7 +17,6 @@ 'TRACE' ] app.add_url_rule('/', 'views.bin', views.bin) -app.add_url_rule('/docs/', 'views.docs', views.docs) api.bins.provide_automatic_options = False api.bins.methods = ['POST'] diff --git a/requestbin/templates/doc.html b/requestbin/templates/doc.html deleted file mode 100644 index 3746210..0000000 --- a/requestbin/templates/doc.html +++ /dev/null @@ -1,12 +0,0 @@ -{% extends "layout.html" %} -{% block head %} - -{% endblock %} -{% block content %} - - {{content|safe}} -{% endblock %} diff --git a/requestbin/views.py b/requestbin/views.py index 998d913..5f5375e 100644 --- a/requestbin/views.py +++ b/requestbin/views.py @@ -47,18 +47,6 @@ def bin(name): MAX_REQUESTS=config.MAX_REQUESTS, BIN_TTL=config.BIN_TTL / 3600) else: - db.create_request(bin, request) resp = make_response("ok\n") return resp - - -def docs(name): - doc = db.lookup_doc(name) - if doc: - return render_template('doc.html', - content=doc['content'], - title=doc['title'], - recent=expand_recent_bins()) - else: - return "Not found", 404 From fc5c11ed9661797a9170241f2420279f294647ba Mon Sep 17 00:00:00 2001 From: Cellebyte Date: Wed, 7 Oct 2020 14:52:27 +0200 Subject: [PATCH 06/10] fixed bug with integer --- requestbin/config.py | 2 +- requestbin/models.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requestbin/config.py b/requestbin/config.py index 6f17657..eb6bd71 100644 --- a/requestbin/config.py +++ b/requestbin/config.py @@ -15,7 +15,7 @@ STORAGE_BACKEND = "requestbin.storage.memory.MemoryStorage" MAX_RAW_SIZE = int(os.environ.get('MAX_RAW_SIZE', 1024*10)) IGNORE_HEADERS = [] -MAX_REQUESTS = os.environ.get("MAX_REQUESTS", 20) +MAX_REQUESTS = int(os.environ.get("MAX_REQUESTS", 20)) CLEANUP_INTERVAL = 3600 MAX_JSON_TO_PRETTYPARSE_IN_BYTES = int(os.environ.get('MAX_JSON_TO_PRETTYPARSE_IN_BYTES', 300*1024)) diff --git a/requestbin/models.py b/requestbin/models.py index 7fa2a28..b8ec841 100644 --- a/requestbin/models.py +++ b/requestbin/models.py @@ -56,7 +56,7 @@ def request_count(self): def add(self, request): self.requests.insert(0, Request(request)) if len(self.requests) > self.max_requests: - for _ in xrange(self.max_requests, len(self.requests)): + for _ in range(self.max_requests, len(self.requests)): self.requests.pop(self.max_requests) From 0bb3612e48aeddca28c575f00b8a426298dbf063 Mon Sep 17 00:00:00 2001 From: Marcel Fest Date: Wed, 7 Oct 2020 15:00:32 +0200 Subject: [PATCH 07/10] Update memory.py --- requestbin/storage/memory.py | 1 - 1 file changed, 1 deletion(-) diff --git a/requestbin/storage/memory.py b/requestbin/storage/memory.py index 08da83f..f66c512 100644 --- a/requestbin/storage/memory.py +++ b/requestbin/storage/memory.py @@ -18,7 +18,6 @@ def do_start(self): def _cleanup_loop(self): while True: - print(dir(self)) self.asynchronous.sleep(self.cleanup_interval) self._expire_bins() From e27e8bf2af643f0fda5d2b566c92319be2973e7d Mon Sep 17 00:00:00 2001 From: Marcel Fest Date: Wed, 7 Oct 2020 15:11:46 +0200 Subject: [PATCH 08/10] Update models.py --- requestbin/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requestbin/models.py b/requestbin/models.py index b8ec841..148cc2a 100644 --- a/requestbin/models.py +++ b/requestbin/models.py @@ -55,7 +55,7 @@ def request_count(self): def add(self, request): self.requests.insert(0, Request(request)) - if len(self.requests) > self.max_requests: + if self.request_count > self.max_requests: for _ in range(self.max_requests, len(self.requests)): self.requests.pop(self.max_requests) From ab3460797876d14d57a2dd6a279d8a2064c76004 Mon Sep 17 00:00:00 2001 From: Marcel Fest Date: Mon, 15 Nov 2021 18:11:31 +0100 Subject: [PATCH 09/10] Fixed some things in the dockerfile --- Dockerfile | 28 ++++++++++++++++++---------- requirements.txt | 1 - runtime.txt | 2 +- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/Dockerfile b/Dockerfile index 990cba8..848c161 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,27 +1,35 @@ -FROM python:3.8-alpine +FROM alpine:3.14.3 RUN apk update && apk upgrade && \ apk add \ build-base \ + py3-pip \ + libffi-dev \ + # Package for running environment py3-gevent \ py3-greenlet \ - libffi-dev \ + py3-gunicorn \ + python3-dbg \ + py3-zope-component \ # file file \ - && rm -rf /var/cache/apk/* + && rm -rf /var/cache/apk/* +RUN addgroup -S requestbin && adduser -S requestbin -G requestbin -h /opt/requestbin +USER requestbin # want all dependencies first so that if it's just a code change, don't have to # rebuild as much of the container ADD requirements.txt /opt/requestbin/ RUN pip install -r /opt/requestbin/requirements.txt \ - && rm -rf ~/.pip/cache - + && rm -rf ~/.pip/cache +USER root +RUN apk del \ + build-base \ + py3-pip \ + libffi-dev +USER requestbin # the code -ADD requestbin /opt/requestbin/requestbin/ +ADD requestbin /opt/requestbin/requestbin/ EXPOSE 8000 - WORKDIR /opt/requestbin -ENV PYTHONPATH=/usr/lib/python3.8/site-packages CMD gunicorn -b 0.0.0.0:8000 --worker-class gevent --workers 2 --max-requests 1000 requestbin.app:app - - diff --git a/requirements.txt b/requirements.txt index 5ea2ac8..44767e4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,6 +5,5 @@ Flask-Cors redis msgpack-python python-dateutil -gunicorn==19.9.0 bugsnag blinker diff --git a/runtime.txt b/runtime.txt index 43b47fb..9bff0e0 100644 --- a/runtime.txt +++ b/runtime.txt @@ -1 +1 @@ -python-3.8.5 +python-3.9.6 From f811fad3604df6d4700c6ce8cae170f5305836ed Mon Sep 17 00:00:00 2001 From: Marcel Fest Date: Mon, 15 Nov 2021 18:22:44 +0100 Subject: [PATCH 10/10] Make the image rootles --- Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 848c161..fa26499 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,8 +14,8 @@ RUN apk update && apk upgrade && \ # file file \ && rm -rf /var/cache/apk/* -RUN addgroup -S requestbin && adduser -S requestbin -G requestbin -h /opt/requestbin -USER requestbin +RUN addgroup --gid 1000 -S requestbin && adduser -S requestbin -u 1000 -G requestbin -h /opt/requestbin +USER 1000:1000 # want all dependencies first so that if it's just a code change, don't have to # rebuild as much of the container ADD requirements.txt /opt/requestbin/ @@ -26,10 +26,10 @@ RUN apk del \ build-base \ py3-pip \ libffi-dev -USER requestbin +USER 1000:1000 # the code ADD requestbin /opt/requestbin/requestbin/ EXPOSE 8000 WORKDIR /opt/requestbin -CMD gunicorn -b 0.0.0.0:8000 --worker-class gevent --workers 2 --max-requests 1000 requestbin.app:app +CMD gunicorn -b 0.0.0.0:8000 --worker-class gevent --workers 1 --max-requests 1000 requestbin.app:app