'Performs the subrequest and returns the response.
:param orig_env: The WSGI environment dict; will only be used
to form a new env for the subrequest.
:param attributes: dict of the attributes of the form so far.
:param fp: The file-like object containing the request body.
:param keys: The account keys to validate the signature with.
:returns: (status_line, headers_list, message)'

def _perform_subrequest(self, orig_env, attributes, fp, keys):

    if (not keys):
        raise FormUnauthorized('invalid    signature')
    try:
        max_file_size = int((attributes.get('max_file_size') or 0))
    except ValueError:
        raise FormInvalid('max_file_size    not    an    integer')
    subenv = make_pre_authed_env(orig_env, 'PUT', agent=None, swift_source='FP')
    if ('QUERY_STRING' in subenv):
        del subenv['QUERY_STRING']
    subenv['HTTP_TRANSFER_ENCODING'] = 'chunked'
    subenv['wsgi.input'] = _CappedFileLikeObject(fp, max_file_size)
    if ((not subenv['PATH_INFO'].endswith('/')) and (subenv['PATH_INFO'].count('/') < 4)):
        subenv['PATH_INFO'] += '/'
    subenv['PATH_INFO'] += (attributes['filename'] or 'filename')
    if ('x_delete_at' in attributes):
        try:
            subenv['HTTP_X_DELETE_AT'] = int(attributes['x_delete_at'])
        except ValueError:
            raise FormInvalid('x_delete_at    not    an    integer:    Unix    timestamp    required.')
    if ('x_delete_after' in attributes):
        try:
            subenv['HTTP_X_DELETE_AFTER'] = int(attributes['x_delete_after'])
        except ValueError:
            raise FormInvalid('x_delete_after    not    an    integer:    Number    of    seconds    required.')
    if ('content-type' in attributes):
        subenv['CONTENT_TYPE'] = (attributes['content-type'] or 'application/octet-stream')
    elif ('CONTENT_TYPE' in subenv):
        del subenv['CONTENT_TYPE']
    try:
        if (int((attributes.get('expires') or 0)) < time()):
            raise FormUnauthorized('form    expired')
    except ValueError:
        raise FormInvalid('expired    not    an    integer')
    hmac_body = ('%s\n%s\n%s\n%s\n%s' % (orig_env['PATH_INFO'], (attributes.get('redirect') or ''), (attributes.get('max_file_size') or '0'), (attributes.get('max_file_count') or '0'), (attributes.get('expires') or '0')))
    has_valid_sig = False
    for key in keys:
        sig = hmac.new(key, hmac_body, sha1).hexdigest()
        if streq_const_time(sig, (attributes.get('signature') or 'invalid')):
            has_valid_sig = True
    if (not has_valid_sig):
        raise FormUnauthorized('invalid    signature')
    substatus = [None]
    subheaders = [None]
    wsgi_input = subenv['wsgi.input']
    def _start_response(status, headers, exc_info=None):
        if wsgi_input.file_size_exceeded:
            raise EOFError('max_file_size    exceeded')
        substatus[0] = status
        subheaders[0] = headers
    i = iter(self.app(subenv, _start_response))
    try:
        next(i)
    except StopIteration:
        pass
    return (substatus[0], subheaders[0], '')
