requests doesn't prepare the request before passing it to the Auth backend.

I know you will answer that this is a feature, but I am really stuck with https://github.com/mozilla-services/requests-hawk/pull/7/files

My Auth backend create a signature for the body, and I cannot read the body from the `Request()` object. Also it doesn't work with the json parameter.

I am not sure of the strategy I should adopt. Any thoughs?

``` python
# Auth backend call method.
    def __call__(self, r):
        if self.host is not None:
            r.headers['Host'] = self.host

        content_type = r.headers.get('Content-Type', '')

        body = ''
        if r.data:
            body = r.data
        elif r.json:
            body = json.dumps(r.json)
            content_type = 'application/json'

        sender = mohawk.Sender(
            self.credentials,
            r.url,
            r.method,
            content=body,
            content_type=content_type,
            _timestamp=self._timestamp
        )

        r.headers['Authorization'] = sender.request_header
        return r

```


I have no clue how you're using the auth plugin, but it only works with `PreparedRequests`. It has never worked with `Request` objects. It's called by [`PreparedRequest.prepare_auth`](https://github.com/kennethreitz/requests/blob/14a555ac716866678bf17e43e23230d81a8149f5/requests/models.py#L473).


If it works with PreparedRequest, then it should have a populated `r.body` isn't it?


Ok so this `__call__` method:

``` python
    def __call__(self, r):
        if self.host is not None:
            r.headers['Host'] = self.host

        sender = mohawk.Sender(
            self.credentials,
            r.url,
            r.method,
            content=r.body or '',
            content_type=r.headers.get('Content-Type'),
            _timestamp=self._timestamp
        )

        r.headers['Authorization'] = sender.request_header
        return r
```

Works.


Body can be `None` or a file-like object or a string or a bytes object. The body attribute is not guaranteed to be "populated" depending on what you call that.

Also on redirects, we will (based on RFCs) clear out a body [if we've determined it's the right conditions to do so](https://github.com/kennethreitz/requests/blob/14a555ac716866678bf17e43e23230d81a8149f5/requests/sessions.py#L160..L165).


Do you see anything wrong with this call: 

``` python
        auth = HawkAuth(hawk_session=codecs.encode(b"hello", "hex_codec"),
                        _timestamp=1431698847)

        request = Request('PUT', 'http://www.example.com',
                          json={"foo": "bar"}, auth=auth)
        r = request.prepare()
        self.assertTrue('ts="1431698847"' in r.headers['Authorization'],
                        "Timestamp doesn't match")
        self.assertEqual(r.body, '{"foo": "bar"}')
```


Not immediately. Why?


Oh I think I found the problem!

https://github.com/kennethreitz/requests/blob/14a555ac716866678bf17e43e23230d81a8149f5/requests/models.py#L417
versus
https://github.com/kennethreitz/requests/blob/v2.8.0/requests/models.py#L406

Actually the tag for 2.8.0 doesn't seems to exists.

This was changed with https://github.com/kennethreitz/requests/commit/3948a9562db886e7ead6a48dbcbada34fbeb0838


The tag not existing is something @Lukasa  can fix immediately


I guess I need to wait for the release of 2.8.1 with the fix in order to fix my problem.