private buildHeaders()

in src/core.ts [384:429]


  private buildHeaders({
    options,
    headers,
    contentLength,
    retryCount,
  }: {
    options: FinalRequestOptions;
    headers: Record<string, string | null | undefined>;
    contentLength: string | null | undefined;
    retryCount: number;
  }): Record<string, string> {
    const reqHeaders: Record<string, string> = {};
    if (contentLength) {
      reqHeaders['content-length'] = contentLength;
    }

    const defaultHeaders = this.defaultHeaders(options);
    applyHeadersMut(reqHeaders, defaultHeaders);
    applyHeadersMut(reqHeaders, headers);

    // let builtin fetch set the Content-Type for multipart bodies
    if (isMultipartBody(options.body) && shimsKind !== 'node') {
      delete reqHeaders['content-type'];
    }

    // Don't set theses headers if they were already set or removed through default headers or by the caller.
    // We check `defaultHeaders` and `headers`, which can contain nulls, instead of `reqHeaders` to account
    // for the removal case.
    if (
      getHeader(defaultHeaders, 'x-stainless-retry-count') === undefined &&
      getHeader(headers, 'x-stainless-retry-count') === undefined
    ) {
      reqHeaders['x-stainless-retry-count'] = String(retryCount);
    }
    if (
      getHeader(defaultHeaders, 'x-stainless-timeout') === undefined &&
      getHeader(headers, 'x-stainless-timeout') === undefined &&
      options.timeout
    ) {
      reqHeaders['x-stainless-timeout'] = String(Math.trunc(options.timeout / 1000));
    }

    this.validateHeaders(reqHeaders, headers);

    return reqHeaders;
  }