Handle DB creation race condition

Till now if a race occurs on a request to a DB when it is
first created, the loosing party die with 500...
... and an error stating a race is in the log file.

Both removed by simply accepting the fact that the DB is in fact
created by someone else - just less work for us to do... ;)

Fixes Bug #1051998

Change-Id: I8e29bf362edf2b1a84f9bffa39c04d5b3dc241b2
Rework to support RFC 2616 Sec 4.4 Message Length

RFC 2616 Sec 4.4 Message Length describes how the content-length and
transfer-encoding headers interact. Basically, if chunked transfer
encoding is used, the content-length header value is ignored and if
the content-length header is present, and the request is not using
chunked transfer-encoding, then the content-length must match the body
length.

The only Transfer-Coding value we support in the Transfer-Encoding
header (to date) is "chunked". RFC 2616 Sec 14.41 specifies that if
"multiple encodings have been applied to an entity, the
transfer-codings MUST be listed in the order in which they were
applied." Since we only supported "chunked". If the Transfer-Encoding
header value has multiple transfer-codings, we return a 501 (Not
Implemented) (see RFC 2616 Sec 3.6) without checking if chunked is the
last one specified. Finally, if transfer-encoding is anything but
"chunked", we return a 400 (Bad Request) to the client.

This patch adds a new method, message_length, to the swob request
object which will apply an algorithm based on RFC 2616 Sec 4.4
leveraging the existing content_length property.

In addition to these changes, the proxy server will now notice when
the message length specified by the content-length header is greater
than the configured object maximum size and fail the request with a
413, "Request Entity Too Large", before reading the entire body.

This work flows from https://review.openstack.org/27152.

Change-Id: I5d2a30b89092680dee9d946e1aafd017eaaef8c0
Signed-off-by: Peter Portante <peter.portante@redhat.com>
Move parameter checking before disk accesses

For HEAD and GET requests on both containers and accounts APIs we now
perform parameter checking before we access the database. The unit
tests were updated to show that the parameter checking is performed
before accesses are performed.

Change-Id: Ieb753316cdccabf45022e3d83522d87d34aa6b0e
Signed-off-by: Peter Portante <peter.portante@redhat.com>
Subtle change to tempurl content-disposition names

If an object name ends with a /, the content-disposition filename for
a tempurl ended up as an empty string. This fix just strips any
trailing slashes before calling basename.

Also, I added a test to verify that if the filename is passed as an
overriding query parameter, that it is used in full, no rstripping,
no basenaming.

Change-Id: I37725b6ded04ed3b91cdb21132490fd857276e2f
In TempURL, cache "no keys" for a shorter time.

In other places in the codebase, we cache a negative result for less
time (usually a tenth) than we cache a positive result. This commit
makes TempURL do the same.

This creates a slightly nicer experience for someone trying to set up
TempURL; if they get the initial key setup wrong, try it, then fix it,
it now takes only 6 seconds until they can use signed URLs, not
60. That's a short enough time that they may not even notice the
caching of no keys.

Change-Id: I521f023e7cddaecd07f0ce32aedd4059bd0b8ec4
Merge "Subtle change to tempurl content-disposition names"
Merge "Move parameter checking before disk accesses"
Merge "Handle DB creation race condition"
Mock SysLogHandler for proxy/test_server.py

Our tests get rather grabby with file descriptors, mostly due to the
SysLogHandler. In recent work I'm doing, my additional tests put
things just over the 1024 limit and tests would start to fail
somewhat randomly. This alleviates the problem by mocking out one of
the bigger users of SysLogHandler, proxy/test_server.py. If you want
to verify this has an impact, you can put the following in your
proxy/test_server.py's overall teardown method and try it with and
without the mocking:

    import subprocess
    print >>sys.stderr, '%s OPEN FILES' % len(subprocess.Popen(
        ['lsof'], stdout=subprocess.PIPE).communicate()[0].split('\n'))

Change-Id: I1bd3efe46ee69d09a32c5a964f04e36e46506446
Merge "Rework to support RFC 2616 Sec 4.4 Message Length"
Replaced <exc>.message with str(<exc>)

Change-Id: I9a030b84dafe2b2300e8735052f6f15f34bc7aa7
Merge "Mock SysLogHandler for proxy/test_server.py"