drop cgi import

Fixes https://pagure.io/koji/issue/3966
This commit is contained in:
Mike McLean 2024-10-29 19:31:14 -04:00
parent 603f002dc2
commit 4eecaddb47
3 changed files with 57 additions and 22 deletions

View file

@ -111,6 +111,7 @@ def application(environ, start_response):
# provide some needed info
environ['SCRIPT_FILENAME'] = wsgi_publisher.__file__
environ['REQUEST_URI'] = get_url(environ)
environ['REQUEST_SCHEME'] = environ['wsgi.url_scheme']
set_config(environ)
if FIRST:
pprint.pprint(environ)

View file

@ -19,7 +19,6 @@
# Authors:
# Mike McLean <mikem@redhat.com>
import cgi
import inspect
import logging
import os.path
@ -241,29 +240,14 @@ class Dispatcher(object):
func = self.handler_index.get(method)
if not func:
raise URLNotFound
# parse form args
data = {}
fs = cgi.FieldStorage(fp=environ['wsgi.input'],
environ=environ.copy(),
keep_blank_values=True)
for field in fs.list:
if field.filename:
val = field
else:
val = field.value
data.setdefault(field.name, []).append(val)
# replace singleton lists with single values
# XXX - this is a bad practice, but for now we strive to emulate mod_python.publisher
for arg in data:
val = data[arg]
if isinstance(val, list) and len(val) == 1:
data[arg] = val[0]
# parse url args
fs = kojiweb.util.FieldStorageCompat(environ)
environ['koji.form'] = fs
args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = \
inspect.getfullargspec(func)
if not varkw:
# remove any unexpected args
data = dslice(data, args, strict=False)
data = dslice(fs.data, args, strict=False)
# TODO (warning in header or something?)
return func, data

View file

@ -26,10 +26,11 @@ import re
import ssl
import stat
import urllib
# a bunch of exception classes that explainError needs
from socket import error as socket_error
from xml.parsers.expat import ExpatError
from collections.abc import Mapping
from functools import wraps
from socket import error as socket_error
from urllib.parse import parse_qs
from xml.parsers.expat import ExpatError
import Cheetah.Template
@ -206,6 +207,55 @@ def _getValidTokens(environ):
return tokens
class FieldStorageCompat(Mapping):
"""Emulate the parts of cgi.FieldStorage that we need"""
def __init__(self, environ):
data = parse_qs(environ.get('QUERY_STRING', ''), strict_parsing=True,
keep_blank_values=True)
# replace singleton lists with single values
for arg in data:
val = data[arg]
if isinstance(val, list) and len(val) == 1:
data[arg] = val[0]
self.data = data
# we need getitem, iter, and len for the Mapping inheritance to work
def __getitem__(self, key):
return FieldCompat(self.data[key])
def __iter__(self):
iter(self.data)
def __len__(self):
return len(self.data)
def getfirst(self, name, default=None):
"""Get first value from list entries"""
value = self.data.get(name, default)
if isinstance(value, (list, tuple)):
return value[0]
else:
return value
def getlist(self, name):
"""Get value, wrap in list if not already"""
if name not in self.data:
return []
value = self.data[name]
if isinstance(value, (list, tuple)):
return value
else:
return [value]
class FieldCompat:
def __init__(self, value):
self.value = value
def toggleOrder(template, sortKey, orderVar='order'):
"""
If orderVar equals 'sortKey', return '-sortKey', else