我的 http 服务器收到了包含文件的 post 请求,如何也使用 POST 方法转发到外部 URL

问题描述

我遇到了一个问题,我搜索了很多,但这里没有任何代码符合我的要求

我正在使用 http.server - BaseHTTPRequestHandler 运行 python 本地服务器

这是我的代码

def run_http():
    port=80
    server_address = ('',port)
    httpd = ThreadingHTTPServer(server_address,serverClass)

    # print('HTTP server running on port %s'% port)
    httpd.serve_forever()

class serverClass(BaseHTTPRequestHandler):
    def _set_headers(self):
        self.send_response(200)
        self.send_header('Content-type','text/html')
        self.end_headers()

    def do_GET(self):
        self._set_headers()

        if self.path == '/':
            with open("static\\index.html",'r') as f:
                res = f.read()
            self.wfile.write(res.encode('utf-8'))

        elif self.path == '/favicon.ico':
            with open("static\\favicon.ico",'rb') as f:
                res = f.read()
            self.wfile.write(res)
        
        else:
            ...


    def do_HEAD(self):
        self._set_headers()
        
    def do_POST(self):
        # content_length = int(self.headers['Content-Length'])
        # post_data = self.rfile.read(content_length)
        # <= here I need to forward the post request to another URL _POST_URL
        # The post request I received may include file and may be not,so I need to forward the post request as it is

我尝试了一些代码,例如:

ctype,pdict = cgi.parse_header(self.headers['content-type'])
pdict['boundary'] = bytes(pdict['boundary'],"utf-8")
if ctype == 'multipart/form-data':
    fields = cgi.parse_multipart(self.rfile,pdict)
    field_file = {'file':(fields.get('file'),"multipart/form-data")}
    fields.pop('file')
    r = requests.post(_POST_URL+'/in.PHP',files = field_file,data = fields)

注意:我知道该文件的帖子名称file代码有效,但问题是我没有发送文件类型或文件名,我无法真正得到它。 我的方式是否正确,或者我应该使用更高效的代码

解决方法

好的,我用了 Form

如果有人感兴趣,这里是代码;

cgi.FieldStorage

这段代码对我有用,不知道有没有更好的方法!