denoland / deno

A modern runtime for JavaScript and TypeScript.
https://deno.com
MIT License
95.7k stars 5.3k forks source link

FormData uses chunked encoding rather than `Content-Length`, even for known-sized form uploads #21626

Open litttley opened 10 months ago

litttley commented 10 months ago

Version: Deno 1.39.0

for formData request build can't got content-length header


const hander=async (req)=>{
   let data
    if (req.method === 'POST') {
            const formData = await req.formData()

            const file = formData.get('file')

            const FromEmail = formData.get('FromEmail')
            const ToEmail1 = formData.get('ToEmail1')
            const MessageText = formData.get('MessageText')

            let formDataNew = new FormData();

            formDataNew.append("FromEmail", FromEmail);

            formDataNew.append("ToEmail1",ToEmail1);

            formDataNew.append("MessageText",MessageText);
            formDataNew.append("upfile", file, file.name);

              const request = new Request("https://post.deno.dev", {
                 method: "POST",
                body: formDataNew });

                console.log(request.headers); 

                //todo 

               // fetch(request)

            data = { fileName:file.name  ,MessageText,FromEmail,ToEmail1,headers:{
                'content-type':request.headers.get('content-type'),
                'content-length':request.headers.get('content-length'),
            }}

            console.info(data)
        }

         const res = new Response(
            `<!DOCTYPE html>
            <html lang="en">
            <head>
                <meta charset="utf-8">
                <title>repro</title>
            </head>
            <body>
                <form method="post" action="" enctype="multipart/form-data">
                    <p><input type="file" required name="file"></p>
                    <p><input type="text" name="FromEmail" placeholder="FromEmail"  ></p>
                    <p><input type="text" name="ToEmail1" placeholder="ToEmail1"  ></p>
                    <p><input type="text" name="MessageText" placeholder="MessageText"  ></p>

                    <p><input type="submit"></p>
                </form>
                ${data
                    ? `<pre>${
                        JSON.stringify(data, null, 4).replaceAll(/[&<>'"]/g, (m) => `&#${m.codePointAt(0)!};`)
                    }</pre>`
                    : ''
                }
            </body>
            <script>
                const file = new File(['file'], '选择文件')
                const dt = new DataTransfer()
                dt.items.add(file)

                document.querySelector('[name=file]').files = dt.files
            </script>
            </html>`,
            { headers: { 'Content-Type': 'text/html' } }
        )

 return res
}

Deno.serve(hander);
mmastrac commented 10 months ago

We currently don't provide a Content-Length for FormData because the object is streamed as a Blob.

@crowlKats Is this something we can do without making the FormData serialization too slow?