123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- import isPlainObject from "is-plain-object";
- import nodeFetch from "node-fetch";
- import { RequestError } from "@octokit/request-error";
- import getBuffer from "./get-buffer-response";
- export default function fetchWrapper(requestOptions) {
- if (isPlainObject(requestOptions.body) ||
- Array.isArray(requestOptions.body)) {
- requestOptions.body = JSON.stringify(requestOptions.body);
- }
- let headers = {};
- let status;
- let url;
- const fetch = (requestOptions.request && requestOptions.request.fetch) || nodeFetch;
- return fetch(requestOptions.url, Object.assign({
- method: requestOptions.method,
- body: requestOptions.body,
- headers: requestOptions.headers,
- redirect: requestOptions.redirect,
- }, requestOptions.request))
- .then((response) => {
- url = response.url;
- status = response.status;
- for (const keyAndValue of response.headers) {
- headers[keyAndValue[0]] = keyAndValue[1];
- }
- if (status === 204 || status === 205) {
- return;
- }
- // GitHub API returns 200 for HEAD requests
- if (requestOptions.method === "HEAD") {
- if (status < 400) {
- return;
- }
- throw new RequestError(response.statusText, status, {
- headers,
- request: requestOptions,
- });
- }
- if (status === 304) {
- throw new RequestError("Not modified", status, {
- headers,
- request: requestOptions,
- });
- }
- if (status >= 400) {
- return response
- .text()
- .then((message) => {
- const error = new RequestError(message, status, {
- headers,
- request: requestOptions,
- });
- try {
- let responseBody = JSON.parse(error.message);
- Object.assign(error, responseBody);
- let errors = responseBody.errors;
- // Assumption `errors` would always be in Array format
- error.message =
- error.message + ": " + errors.map(JSON.stringify).join(", ");
- }
- catch (e) {
- // ignore, see octokit/rest.js#684
- }
- throw error;
- });
- }
- const contentType = response.headers.get("content-type");
- if (/application\/json/.test(contentType)) {
- return response.json();
- }
- if (!contentType || /^text\/|charset=utf-8$/.test(contentType)) {
- return response.text();
- }
- return getBuffer(response);
- })
- .then((data) => {
- return {
- status,
- url,
- headers,
- data,
- };
- })
- .catch((error) => {
- if (error instanceof RequestError) {
- throw error;
- }
- throw new RequestError(error.message, 500, {
- headers,
- request: requestOptions,
- });
- });
- }
|