diff --git a/s3tests/functional/test_s3.py b/s3tests/functional/test_s3.py
index 5f413ee..28905ae 100644
--- a/s3tests/functional/test_s3.py
+++ b/s3tests/functional/test_s3.py
@@ -23,6 +23,7 @@ import threading
import itertools
import string
import random
+import re
import xml.etree.ElementTree as ET
@@ -832,6 +833,27 @@ def test_object_read_notexist():
eq(e.reason, 'Not Found')
eq(e.error_code, 'NoSuchKey')
+@attr(resource='object')
+@attr(method='get')
+@attr(operation='read contents that were never written to raise one error response')
+@attr(assertion='RequestId appears in the error response')
+def test_object_requestid_on_error():
+ bucket = get_new_bucket()
+ key = bucket.new_key('foobar')
+ e = assert_raises(boto.exception.S3ResponseError, key.get_contents_as_string)
+ request_id = re.search(r'.*', e.body.encode('utf-8')).group(0)
+ assert request_id is not None
+
+@attr(resource='object')
+@attr(method='get')
+@attr(operation='read contents that were never written to raise one error response')
+@attr(assertion='RequestId in the error response matchs the x-amz-request-id in the headers')
+def test_object_requestid_matchs_header_on_error():
+ bucket = get_new_bucket()
+ key = bucket.new_key('foobar')
+ e = assert_raises(boto.exception.S3ResponseError, key.get_contents_as_string)
+ request_id = re.search(r'(.*)', e.body.encode('utf-8')).group(1)
+ eq(key.resp.getheader('x-amz-request-id'), request_id)
@attr(resource='object')
@attr(method='put')