We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Using the _since querystring filter has no effect
I've tried using the `_since` querystring filter as explained in the tutorial, but it seems to have no effect.

`GET`ing any of those urls returns the exact same list (the full list of records)

```
http GET http://0.0.0.0:8888/v1/buckets/default/collections/tasks/records?_since=1436094288171 -v  --auth 'user:password'
http GET http://0.0.0.0:8888/v1/buckets/default/collections/tasks/records?_since=foobar -v  --auth 'user:password'
http GET http://0.0.0.0:8888/v1/buckets/default/collections/tasks/records?_since=`date +%s` -v  --auth 'user:password'
```

The last one uses the current timestamp as the value, which means it should return an empty list.


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `kinto/views/buckets.py`
Content:
```
1 from pyramid.httpexceptions import HTTPForbidden, HTTPPreconditionFailed
2 from pyramid.security import NO_PERMISSION_REQUIRED
3 from pyramid.view import view_config
4 
5 from cliquet import resource
6 from cliquet.utils import hmac_digest, build_request
7 
8 from kinto.views import NameGenerator
9 
10 
11 def create_bucket(request, bucket_id):
12     """Create a bucket if it doesn't exists."""
13     bucket_put = (request.method.lower() == 'put' and
14                   request.path.endswith('buckets/default'))
15 
16     if not bucket_put:
17         subrequest = build_request(request, {
18             'method': 'PUT',
19             'path': '/buckets/%s' % bucket_id,
20             'body': {"data": {}},
21             'headers': {'If-None-Match': '*'.encode('utf-8')}
22         })
23 
24         try:
25             request.invoke_subrequest(subrequest)
26         except HTTPPreconditionFailed:
27             # The bucket already exists
28             pass
29 
30 
31 def create_collection(request, bucket_id):
32     subpath = request.matchdict['subpath']
33     if subpath.startswith('/collections/'):
34         collection_id = subpath.split('/')[2]
35         collection_put = (request.method.lower() == 'put' and
36                           request.path.endswith(collection_id))
37         if not collection_put:
38             subrequest = build_request(request, {
39                 'method': 'PUT',
40                 'path': '/buckets/%s/collections/%s' % (
41                     bucket_id, collection_id),
42                 'body': {"data": {}},
43                 'headers': {'If-None-Match': '*'.encode('utf-8')}
44             })
45             try:
46                 request.invoke_subrequest(subrequest)
47             except HTTPPreconditionFailed:
48                 # The collection already exists
49                 pass
50 
51 
52 @view_config(route_name='default_bucket', permission=NO_PERMISSION_REQUIRED)
53 def default_bucket(request):
54     if getattr(request, 'prefixed_userid', None) is None:
55         raise HTTPForbidden  # Pass through the forbidden_view_config
56 
57     settings = request.registry.settings
58     hmac_secret = settings['cliquet.userid_hmac_secret']
59     # Build the user unguessable bucket_id UUID from its user_id
60     bucket_id = hmac_digest(hmac_secret, request.prefixed_userid)[:32]
61     path = request.path.replace('default', bucket_id)
62 
63     # Make sure bucket exists
64     create_bucket(request, bucket_id)
65 
66     # Make sure the collection exists
67     create_collection(request, bucket_id)
68 
69     subrequest = build_request(request, {
70         'method': request.method,
71         'path': path,
72         'body': request.body
73     })
74 
75     return request.invoke_subrequest(subrequest)
76 
77 
78 @resource.register(name='bucket',
79                    collection_methods=('GET',),
80                    collection_path='/buckets',
81                    record_path='/buckets/{{id}}')
82 class Bucket(resource.ProtectedResource):
83     permissions = ('read', 'write', 'collection:create', 'group:create')
84 
85     def __init__(self, *args, **kwargs):
86         super(Bucket, self).__init__(*args, **kwargs)
87         self.collection.id_generator = NameGenerator()
88 
89     def get_parent_id(self, request):
90         # Buckets are not isolated by user, unlike Cliquet resources.
91         return ''
92 
93     def delete(self):
94         result = super(Bucket, self).delete()
95 
96         # Delete groups.
97         storage = self.collection.storage
98         parent_id = '/buckets/%s' % self.record_id
99         storage.delete_all(collection_id='group', parent_id=parent_id)
100 
101         # Delete collections.
102         deleted = storage.delete_all(collection_id='collection',
103                                      parent_id=parent_id)
104 
105         # Delete records.
106         id_field = self.collection.id_field
107         for collection in deleted:
108             parent_id = '/buckets/%s/collections/%s' % (self.record_id,
109                                                         collection[id_field])
110             storage.delete_all(collection_id='record', parent_id=parent_id)
111 
112         return result
113
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/kinto/views/buckets.py b/kinto/views/buckets.py
--- a/kinto/views/buckets.py
+++ b/kinto/views/buckets.py
@@ -59,6 +59,8 @@
     # Build the user unguessable bucket_id UUID from its user_id
     bucket_id = hmac_digest(hmac_secret, request.prefixed_userid)[:32]
     path = request.path.replace('default', bucket_id)
+    querystring = request.url[(request.url.index(request.path) +
+                               len(request.path)):]
 
     # Make sure bucket exists
     create_bucket(request, bucket_id)
@@ -68,7 +70,7 @@
 
     subrequest = build_request(request, {
         'method': request.method,
-        'path': path,
+        'path': path + querystring,
         'body': request.body
     })

{"golden_diff": "diff --git a/kinto/views/buckets.py b/kinto/views/buckets.py\n--- a/kinto/views/buckets.py\n+++ b/kinto/views/buckets.py\n@@ -59,6 +59,8 @@\n     # Build the user unguessable bucket_id UUID from its user_id\n     bucket_id = hmac_digest(hmac_secret, request.prefixed_userid)[:32]\n     path = request.path.replace('default', bucket_id)\n+    querystring = request.url[(request.url.index(request.path) +\n+                               len(request.path)):]\n \n     # Make sure bucket exists\n     create_bucket(request, bucket_id)\n@@ -68,7 +70,7 @@\n \n     subrequest = build_request(request, {\n         'method': request.method,\n-        'path': path,\n+        'path': path + querystring,\n         'body': request.body\n     })\n", "issue": "Using the _since querystring filter has no effect\nI've tried using the `_since` querystring filter as explained in the tutorial, but it seems to have no effect.\n\n`GET`ing any of those urls returns the exact same list (the full list of records)\n\n```\nhttp GET http://0.0.0.0:8888/v1/buckets/default/collections/tasks/records?_since=1436094288171 -v  --auth 'user:password'\nhttp GET http://0.0.0.0:8888/v1/buckets/default/collections/tasks/records?_since=foobar -v  --auth 'user:password'\nhttp GET http://0.0.0.0:8888/v1/buckets/default/collections/tasks/records?_since=`date +%s` -v  --auth 'user:password'\n```\n\nThe last one uses the current timestamp as the value, which means it should return an empty list.\n\n", "before_files": [{"content": "from pyramid.httpexceptions import HTTPForbidden, HTTPPreconditionFailed\nfrom pyramid.security import NO_PERMISSION_REQUIRED\nfrom pyramid.view import view_config\n\nfrom cliquet import resource\nfrom cliquet.utils import hmac_digest, build_request\n\nfrom kinto.views import NameGenerator\n\n\ndef create_bucket(request, bucket_id):\n    \"\"\"Create a bucket if it doesn't exists.\"\"\"\n    bucket_put = (request.method.lower() == 'put' and\n                  request.path.endswith('buckets/default'))\n\n    if not bucket_put:\n        subrequest = build_request(request, {\n            'method': 'PUT',\n            'path': '/buckets/%s' % bucket_id,\n            'body': {\"data\": {}},\n            'headers': {'If-None-Match': '*'.encode('utf-8')}\n        })\n\n        try:\n            request.invoke_subrequest(subrequest)\n        except HTTPPreconditionFailed:\n            # The bucket already exists\n            pass\n\n\ndef create_collection(request, bucket_id):\n    subpath = request.matchdict['subpath']\n    if subpath.startswith('/collections/'):\n        collection_id = subpath.split('/')[2]\n        collection_put = (request.method.lower() == 'put' and\n                          request.path.endswith(collection_id))\n        if not collection_put:\n            subrequest = build_request(request, {\n                'method': 'PUT',\n                'path': '/buckets/%s/collections/%s' % (\n                    bucket_id, collection_id),\n                'body': {\"data\": {}},\n                'headers': {'If-None-Match': '*'.encode('utf-8')}\n            })\n            try:\n                request.invoke_subrequest(subrequest)\n            except HTTPPreconditionFailed:\n                # The collection already exists\n                pass\n\n\n@view_config(route_name='default_bucket', permission=NO_PERMISSION_REQUIRED)\ndef default_bucket(request):\n    if getattr(request, 'prefixed_userid', None) is None:\n        raise HTTPForbidden  # Pass through the forbidden_view_config\n\n    settings = request.registry.settings\n    hmac_secret = settings['cliquet.userid_hmac_secret']\n    # Build the user unguessable bucket_id UUID from its user_id\n    bucket_id = hmac_digest(hmac_secret, request.prefixed_userid)[:32]\n    path = request.path.replace('default', bucket_id)\n\n    # Make sure bucket exists\n    create_bucket(request, bucket_id)\n\n    # Make sure the collection exists\n    create_collection(request, bucket_id)\n\n    subrequest = build_request(request, {\n        'method': request.method,\n        'path': path,\n        'body': request.body\n    })\n\n    return request.invoke_subrequest(subrequest)\n\n\n@resource.register(name='bucket',\n                   collection_methods=('GET',),\n                   collection_path='/buckets',\n                   record_path='/buckets/{{id}}')\nclass Bucket(resource.ProtectedResource):\n    permissions = ('read', 'write', 'collection:create', 'group:create')\n\n    def __init__(self, *args, **kwargs):\n        super(Bucket, self).__init__(*args, **kwargs)\n        self.collection.id_generator = NameGenerator()\n\n    def get_parent_id(self, request):\n        # Buckets are not isolated by user, unlike Cliquet resources.\n        return ''\n\n    def delete(self):\n        result = super(Bucket, self).delete()\n\n        # Delete groups.\n        storage = self.collection.storage\n        parent_id = '/buckets/%s' % self.record_id\n        storage.delete_all(collection_id='group', parent_id=parent_id)\n\n        # Delete collections.\n        deleted = storage.delete_all(collection_id='collection',\n                                     parent_id=parent_id)\n\n        # Delete records.\n        id_field = self.collection.id_field\n        for collection in deleted:\n            parent_id = '/buckets/%s/collections/%s' % (self.record_id,\n                                                        collection[id_field])\n            storage.delete_all(collection_id='record', parent_id=parent_id)\n\n        return result\n", "path": "kinto/views/buckets.py"}], "after_files": [{"content": "from pyramid.httpexceptions import HTTPForbidden, HTTPPreconditionFailed\nfrom pyramid.security import NO_PERMISSION_REQUIRED\nfrom pyramid.view import view_config\n\nfrom cliquet import resource\nfrom cliquet.utils import hmac_digest, build_request\n\nfrom kinto.views import NameGenerator\n\n\ndef create_bucket(request, bucket_id):\n    \"\"\"Create a bucket if it doesn't exists.\"\"\"\n    bucket_put = (request.method.lower() == 'put' and\n                  request.path.endswith('buckets/default'))\n\n    if not bucket_put:\n        subrequest = build_request(request, {\n            'method': 'PUT',\n            'path': '/buckets/%s' % bucket_id,\n            'body': {\"data\": {}},\n            'headers': {'If-None-Match': '*'.encode('utf-8')}\n        })\n\n        try:\n            request.invoke_subrequest(subrequest)\n        except HTTPPreconditionFailed:\n            # The bucket already exists\n            pass\n\n\ndef create_collection(request, bucket_id):\n    subpath = request.matchdict['subpath']\n    if subpath.startswith('/collections/'):\n        collection_id = subpath.split('/')[2]\n        collection_put = (request.method.lower() == 'put' and\n                          request.path.endswith(collection_id))\n        if not collection_put:\n            subrequest = build_request(request, {\n                'method': 'PUT',\n                'path': '/buckets/%s/collections/%s' % (\n                    bucket_id, collection_id),\n                'body': {\"data\": {}},\n                'headers': {'If-None-Match': '*'.encode('utf-8')}\n            })\n            try:\n                request.invoke_subrequest(subrequest)\n            except HTTPPreconditionFailed:\n                # The collection already exists\n                pass\n\n\n@view_config(route_name='default_bucket', permission=NO_PERMISSION_REQUIRED)\ndef default_bucket(request):\n    if getattr(request, 'prefixed_userid', None) is None:\n        raise HTTPForbidden  # Pass through the forbidden_view_config\n\n    settings = request.registry.settings\n    hmac_secret = settings['cliquet.userid_hmac_secret']\n    # Build the user unguessable bucket_id UUID from its user_id\n    bucket_id = hmac_digest(hmac_secret, request.prefixed_userid)[:32]\n    path = request.path.replace('default', bucket_id)\n    querystring = request.url[(request.url.index(request.path) +\n                               len(request.path)):]\n\n    # Make sure bucket exists\n    create_bucket(request, bucket_id)\n\n    # Make sure the collection exists\n    create_collection(request, bucket_id)\n\n    subrequest = build_request(request, {\n        'method': request.method,\n        'path': path + querystring,\n        'body': request.body\n    })\n\n    return request.invoke_subrequest(subrequest)\n\n\n@resource.register(name='bucket',\n                   collection_methods=('GET',),\n                   collection_path='/buckets',\n                   record_path='/buckets/{{id}}')\nclass Bucket(resource.ProtectedResource):\n    permissions = ('read', 'write', 'collection:create', 'group:create')\n\n    def __init__(self, *args, **kwargs):\n        super(Bucket, self).__init__(*args, **kwargs)\n        self.collection.id_generator = NameGenerator()\n\n    def get_parent_id(self, request):\n        # Buckets are not isolated by user, unlike Cliquet resources.\n        return ''\n\n    def delete(self):\n        result = super(Bucket, self).delete()\n\n        # Delete groups.\n        storage = self.collection.storage\n        parent_id = '/buckets/%s' % self.record_id\n        storage.delete_all(collection_id='group', parent_id=parent_id)\n\n        # Delete collections.\n        deleted = storage.delete_all(collection_id='collection',\n                                     parent_id=parent_id)\n\n        # Delete records.\n        id_field = self.collection.id_field\n        for collection in deleted:\n            parent_id = '/buckets/%s/collections/%s' % (self.record_id,\n                                                        collection[id_field])\n            storage.delete_all(collection_id='record', parent_id=parent_id)\n\n        return result\n", "path": "kinto/views/buckets.py"}]}