New lines in FormData are converted to carriage return + new line

For Workes & Pages, what is the name of the domain?

playground

What is the issue or error you’re encountering

When FormData is posted to a worker, new lines are converted to carriage return + new line.

What are the steps to reproduce the issue?

Here is a playground link which reproduces the issue.

// FormData: new line is received on the server as carriage return + new line

const html = `
<script type="module">
const body = new FormData();
body.set('content', String.fromCharCode(10));
const response = await fetch(location.origin, { method: 'POST', body });
document.body.textContent = await response.text();
</script>`

export default {
	async fetch(request) {
		if (request.method === 'GET') {
			return new Response(html, { headers: { 'content-type': 'text/html' } });
		};
		if (request.method === 'POST') {
			const body = await request.formData();
			const content = body.get('content');
			const message =`Received length: ${content.length}; Received chars: ${Array.from(content).map(c => c.charCodeAt(0)).join(',')}`;
			return new Response(message, { headers: { 'content-type': 'text/plain' } });
		}
	}
};

https://workers.cloudflare.com/playground#LYVwNgLglgDghgJwgegGYHsHALQBM4RwDcABAEbogB2+CAngLzbPYDqApmQNJQQBimYACFKNRHQDsAFQCaAUQCcAVQBWAQRlcAzAGUAxgBEACiABcLFh268BWEdVqTZi1Ru37jIALAAoAMLoVBDsQdgGUADOMOgRvFCBpiQYWHgExCRUcMDsDABE+IQAdCoRuaSoUGAhWTn5acWlvgFBIRDYUnQw7IlwMDBgUHoE8VTIKnAAbnARegiwEADUwOi44Oy+vuwAHtFIJLjsqHDgECQA3j4AkJnZiblyW1n97CRqRgCSuQA0V4QA5hFEgBtXLbJ5Vb4kXK9KCQ3IIdhRQIRdi5AC6PwAvkQfL4LMwrDx+IJ7GJ6NJ5Mp1JpdIYTE1AsFQuEkbFoAkkoJUoRSDdalAaNsGmUkpVqtk8gKDlthQyWqEOl0en0BkN2aNxlMZnMYItlqsqhsfMhkCRbMADGlElR2AB3EgDG0kSIkBF6dhQCbsXAkQIkCAACxeKIQXoQJGmJCGCDmcD+LwREBACCoJAWGTtDoF7B8Pj0yNOAYgwDAJAYJAABj4ADza+b+zq1fVrXIAPjzBfIKzoZYz9vNlsIAAoAJQ4ii4OiFFEQIcAcnz8ogc6+JB0EDmVD+hVQCHQwD8AcQAQOQ4AjAAGEdjjtUCKnBFIu8vctwW1wXhJdgQPQBodgdA1RGQpMCgP4BVXM4SGyQMVkSOcjAAeR0KQVy7ScSExG9cEAkBsiCQoJynYItggZomVOV930-R9omfQoSNnG9q2QOtdVbKsfG2XZTgOI4TnOK5pjoKg9C-H8-wRABHEBEQgEdBMuS4oFQEgh2k2T70KGCAxWMsGHLOcAHE5FQhSLiUy5E2TVMbXtAAlRE6JRIcixLSCSCDOADgQQFzhIBdGVabAIEbOd4MY5A3LAOdMMwm8lOxK5lNU9T2BkuTtO-XSfQMwykJQudzOSy5F3vdCeyoj8H3SzSIB3QRBzgUccUssrTkXCjeyIwp41nQKlyK1qlPa6DEQiOMXwrRz3U9b0HRCP5A0SAASM5OtaQoqi3QNsRIGaPS9H1f0QPy1rUGM4CnXd9yHDaghHbTejustWyjQoToQE92DUWcr0elR0AFecviKzEK2Gqzvxsvt9qc5F2CHbIIgm+MPK8ny-KggaKJCsKIu2FB+g-KhYsxeLhsxK4qaSvF8UJGwSVERwKRcal3Dpbx-CC5lImiNkRkSZIcAKdI+TyW12DAfNskKaKRQqbaaglqWZfYOXizAXI5VxxVun9QnkGJgUjWrABCAxEL8WQjDkTzNfbatoodOAtzyEI2yuJ32G89slOrGC4CjI9fO-PIlCkPhsAADlyEhkD9y4A+-IOiwgGBsFqz08gADWwJQ1GwAJgHgaAyAhKMeYgPJ3jkBhvXjOOE+S5PCAyZXcgmKA7R4uP7ur3JbSgXBAwYA4u-dbAh5HgNVwFOI4DAbAZkXnIz0KC8m8T6toAgKpWz8ACQFwVAwEQF5WEwABrdhfJIIwz7oP49wcFjd-3lvHSvkqETAPJ7zoFUCIQZvy5BKgGBEqA8hpxgICE0xMn4vxoIUceMA9y4A+kfE+Z8EQoPYBMZAktpb7nYMvUKVQPoozAUpZuScoo+1wO2L2RFt64E9FGM+KM8in3PqUROScoDAD+CQCICA9DQIgOnOBRtH7P2ZngiYaCViYMoNg8+Ci0A4MRIUGAW4t4t2QGwiY29gAk34dWIxHDpgRAltfW+ERsAAT+OgNsLEjHmJgPwy4HBiHZDNiQJQKJ-QBhdA-K6ciHD+nQAbcquA5hegjCQS+CAb4IFXLMH2wREkHGWFEkqlxgHn19FQR07BVyux9LaIMqYETeR7Acfo6B6lQDdHvHsEBomBheA3F4ZAewzmgFuEgIAYARnyYfVRPCEQRj0Pmag9USosU8YsgMZ5WysCPKcF0QdkmpIAPwsVWR4rxagSATOPlMi+djwwugAFKTDgPoHUHUVgvDoJQEgto5hZMDAQTyFSgEkHecmT5nB8lsnYHOCIJAAASUgpBGH9AgOAqAKhiTYa0sAPYBRnKwZcqFJAekOkAsMZEEYkE+i6fk20mAwC4HKWAACQ8hnAqicStULx8wHA4TEF4HSgWUHDCEH0IAQzQpxZgHyeTLJQyfJSzpQZgDQUwC8GSgwr5YsWUbcxRypD0GdKcYFocwCoEOWsxZyyZWIVTEahaqAtnQqDhNEuVQknXOCX8l0CBqBUAFMIv0gYXQQsKCQGQHyhhUHyd6T8n4BgJIqSI9gfKgyukRCcaFQZcEkDkGw04XSSClwDBGCgCT+XIBhNKyyKIXi6XtPmsELqrkpNvv8mggK2Gotvq0V0lBggRBDWGkAUZXYRjABEaJ0aID5PzVyvl0Tq2fM2QS-msRy4vATWQTcwjbU2lIs6A4Qd+UDFQOrLVlq6GmIFH7FiLCaxRQdriHw+I2CcCJOaUkLNnBUjcLSTwOtgosn5nEDkwtuRiw7oHUWCsxTi1yOXdAZBtbcyXO0Rsyp+iDFJRqcdVAjRnFyDLUuUAyCVF4HQAA+gUVEphcgACYLy0YACzYAvFoFjEhvgEf3ERkjAxQrkZ4QCXIpgQRUFeSUcjhGCDoi+LkS9VByPNghDRqUQoSi5ExHTCwDNiR2GZuIVm36aQeBMMwXwQA

RFC 2046 says:

The canonical form of any MIME “text” subtype MUST always represent a line break as a CRLF sequence. Similarly, any occurrence of CRLF in MIME “text” MUST represent a line break. Use of CR and LF outside of line break sequences is also forbidden.

The HTML spec covers x-www-form-urlencoded:

Line breaks, as in multi-line text field values, are represented as CR LF pairs, i.e. `%0D%0A’.

So, this is correct and expected behavior.

1 Like

This topic was automatically closed 2 days after the last reply. New replies are no longer allowed.