Summary: "InvalidUrl Error Handling in HttpClient"

export const instrument = Effect.map(
  HttpClient.client.Client,
  client =>
    HttpClient.client.makeDefault((request) =>
      Effect.flatMap(
        HttpClient.urlParams.makeUrl(request.url, request.urlParams, (_) =>
          HttpClient.error.RequestError({
            request,
            reason: "InvalidUrl",
            error: _,
          })),
        (url) =>
          Effect.useSpan(request.method, {
            attributes: {
              "http.request.method": request.method,
              "url.full": url.href,
              "url.scheme": url.protocol,
              "server.address": url.host,
              "server.port": Number.isNaN(Number(url.port)) ? 443 : Number(url.port),
              "network.protocol.version": "1.1",
            },
          }, span =>
            Effect.suspend(() => {
              ReadonlyRecord.toEntries(request.headers).forEach(([k, v]) =>
                span.attribute(`http.request.header.${k}`, [v])
              );
              return client(request);
            }).pipe(
              Effect.tap(_ => {
                span.attribute("http.response.status_code", _.status);
                ReadonlyRecord.toEntries(request.headers).forEach(([k, v]) =>
                  span.attribute(`http.response.header.${k}`, [v])
                );

                if (_.status >= 400) {
                  span.attribute("error.type", _.status);
                }
              }),
            )),
      )
    ),
);
Was this page helpful?