'The values of :attr:`forms` and :attr:`files` combined into a single
:class:`FormsDict`. Values are either strings (form values) or
instances of :class:`cgi.FieldStorage` (file uploads).'

@DictProperty('environ', 'bottle.request.post', read_only=True)
def POST(self):

    post = FormsDict()
    if (not self.content_type.startswith('multipart/')):
        pairs = _parse_qsl(tonat(self._get_body_string(), 'latin1'))
        for (key, value) in pairs:
            post[key] = value
        return post
    safe_env = {'QUERY_STRING': ''}
    for key in ('REQUEST_METHOD', 'CONTENT_TYPE', 'CONTENT_LENGTH'):
        if (key in self.environ):
            safe_env[key] = self.environ[key]
    args = dict(fp=self.body, environ=safe_env, keep_blank_values=True)
    if py31:
        args['fp'] = NCTextIOWrapper(args['fp'], encoding='utf8', newline='\n')
    elif py3k:
        args['encoding'] = 'utf8'
    data = cgi.FieldStorage(**args)
    self['_cgi.FieldStorage'] = data
    data = (data.list or [])
    for item in data:
        if item.filename:
            post[item.name] = FileUpload(item.file, item.name, item.filename, item.headers)
        else:
            post[item.name] = item.value
    return post
