C0nw0nk
C0nw0nk

Reputation: 970

Javascript Cloudflare worker script not allowing post requests

So I am testing a cloudflare web worker script and i can't seem to get my code to work with POST requests and such.

url_without_query_strings = request.url.split('?')[0] //remove all query strings

    const response = await fetch(url_without_query_strings, {
      method: request.method,
      headers: request.headers
    })
    return response

Can anyone see what I am doing wrong ?

Upvotes: 1

Views: 1477

Answers (1)

Kenton Varda
Kenton Varda

Reputation: 45346

The problem is that you are only copying method and headers from the request, but it has more properties than that. POST requests, for example, have a body property which your code is not copying.

In order to perform a fetch that inherits everything from the original request except the URL, do:

const response = await fetch(url_without_query_strings, request)

That is, pass the request itself as the second parameter, rather than a dict. This works because a request object has property names matching exactly all of the options that fetch()'s second parameter expects.

Note that, awkwardly, if you want to modify any request property other than the URL, but keep other properties the same, then you must pass the request as the first parameter and specify the modifications in the second parameter:

const response = await fetch(request, {headers: myHeaders})

This means that if you want to modify the URL and some other property, you need to perform two steps -- first created a new Request object that changes the URL, then modify the headers:

let request2 = new Request(newUrl, request)
const response = await fetch(request2, {headers: myHeaders})

Or, of course, you could do the opposite order:

let request2 = new Request(request, {headers: myHeaders})
const response = await fetch(newUrl, request2)

Or, alternatively, for the specific case of headers, you can take advantage of the fact that once you've constructed your own Request object, you're allowed to directly modify its headers:

let request2 = new Request(newUrl, request)
request2.headers.set("X-Foo", "Bar")
const response = await fetch(request2)

Upvotes: 6

Related Questions