Skip to content
Advertisement

Fastest way to send 500 requests using JS

I need to write a function that fetches the rate limit test page 500 times with a 200 status code as fast as possible. Cloudflare will rate limit you if you make more than 10 requests within a minute to https://www.cloudflare.com/rate-limit-test.

This is my code so far:

const getRateLimited = () => {
  const promises = [];
  for (let i = 0; i < 500; i++) {
    promises.push(fetch('https://www.cloudflare.com/rate-limit-test'));
  }
  return Promise.all(promises)
    .then(promise => res.send(promise[0].status))
};

Is there a better way of doing this and using setTimeOut?

Advertisement

Answer

10 requests per minute is 1 every 6 seconds

So, just wait between requests

Here is code using async/await – no error checking, that’s up to you

const getRateLimited = async () => {
    const responses = [];
    for (let i = 0; i < 500; i++) {
        const response = await fetch('https://www.cloudflare.com/rate-limit-test');
        responses.push(response);
        await new Promise(r => setTimeout(r, 6000));
    }
    return res.send(responses[0].status); // why?
};

Why do you res.send the first status though?


edit: thinking about it, you want as fast as possible,

First, make the request start every 6 seconds, and remove the last delay

const getRateLimited = async () => {
    const responses = [];
    for (let i = 0; i < 500; i++) {
        const now = Date.now();
        const response = await fetch('https://www.cloudflare.com/rate-limit-test');
        responses.push(response);
        if (i < 499) {
            const after = Date.now();
            const delay = 6000 - (after - now);
            await new Promise(r => setTimeout(r, delay));
        }
    }
    return res.send(responses[0].status);
};

This should make 500 requests over 2994 seconds – which is as fast as you can go I believe


edit: of course, if you can make 10 requests, then wait a minute, then make 10 requests, then wait a minute … rinse and repeat … you can do it in 2940 + some seconds for the last 10 requests – that would knock another 50-54 seconds off the time it takes

const getRateLimited = async () => {
    const responses = [];
    for (let i = 0; i < 500; i++) {
        const response = await fetch('https://www.cloudflare.com/rate-limit-test/');
        responses.push(response);
        if (i < 499 && i % 10 === 9) {
            await new Promise(r => setTimeout(r, 60000));
        }
    }
    return res.send(responses[0].status);
};
User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement