Запрос к Cloudflare DNS от работника Cloudflare, не возвращающего результат DNS - PullRequest
0 голосов
/ 13 июня 2019

У меня есть работник Cloudflare (CF), которому нужно сделать несколько DNS-запросов с использованием CF DNS (https://developers.cloudflare.com/1.1.1.1/dns-over-https/json-format/).

).

Итак, довольно простой рабочий:

/**
 * readRequestBody reads in the incoming request body
 * Use await readRequestBody(..) in an async function to get the string
 * @param {Request} request the incoming request to read from
 */
async function readRequestBody(request) {
  const { headers } = request
  const contentType = headers.get('content-type')

  if (contentType.includes('application/json')) {
    const body = await request.json()
    return JSON.stringify(body)
  }

  return ''
}

/**
 * Respond to the request
 * @param {Request} request
 */
async function handleRequest(request) {
   let reqBody = await readRequestBody(request)

   var jsonTlds = JSON.parse(reqBody);

   const fetchInit = {
      method: 'GET',
    }
   let promises = []
   for (const tld of jsonTlds.tlds) {

       //Dummy request until I can work out why I am not getting the response of the DNS query
       var requestStr = 'https://cloudflare-dns.com/dns-query?ct=application/dns-json&name=example.com&type=A'

       let promise = fetch(requestStr, fetchInit)

       promises.push(promise)
   }

   try {
      let results = await Promise.all(promises)

      return new Response(JSON.stringify(results), {status: 200})
   } catch(err) {
       return new Response(JSON.stringify(err), {status: 500})
   }
}

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

Я только что жестко задал DNS-запрос:

https://cloudflare -dns.com / DNS-запрос? CT = применение / DNS-имя и JSON = example.com & тип = А

и я ожидаю, что результат JSON, который я получу, будет:

{
    "Status": 0,
    "TC": false,
    "RD": true,
    "RA": true,
    "AD": true,
    "CD": false,
    "Question": [
        {
            "name": "example.com.",
            "type": 1
        }
    ],
    "Answer": [
        {
            "name": "example.com.",
            "type": 1,
            "TTL": 9540,
            "data": "93.184.216.34"
        }
    ]
}

однако вместо этого в результатах я получаю то, что представляется результатом веб-сокета, созданного как часть fetch () (при условии, что я обхожу цикл один раз)

[
    {
        "webSocket": null,
        "url": "https://cloudflare-dns.com/dns-query?ct=application/dns-json&name=example.com&type=A",
        "redirected": false,
        "ok": true,
        "headers": {},
        "statusText": "OK",
        "status": 200,
        "bodyUsed": false,
        "body": {
            "locked": false
        }
    }
]

Итак, мой вопрос: что я делаю здесь неправильно, что я не получаю ответ DNS JSON от API 1.1.1.1?

1 Ответ

1 голос
/ 13 июня 2019

fetch() возвращает обещание для Response объекта , который содержит статус ответа, заголовки и основной поток. Этот объект - это то, что вы видите в своих «результатах». Чтобы прочитать ответ body , необходимо совершить дополнительные звонки.

Попробуйте определить функцию следующим образом:

async function fetchJsonBody(req, init) {
  let response = await fetch(req, init);
  if (!response.ok()) {
    // Did not return status 200; throw an error.
    throw new Error(response.status + " " + response.statusText);
  }

  // OK, now we can read the body and parse it as JSON.
  return await response.json();
}

Теперь вы можете изменить:

let promise = fetch(requestStr, fetchInit)

до:

let promise = fetchJsonBody(requestStr, fetchInit)
...