From 9e4a743d1a6cadd2ad8541b87e191d72514c4e91 Mon Sep 17 00:00:00 2001
From: Sergei Zharinov <zharinov@users.noreply.github.com>
Date: Sat, 29 Apr 2023 09:23:36 +0300
Subject: [PATCH] fix(rubygems): Change `accept-encoding` to `gzip` (#21882)

---
 .../rubygems/versions-datasource.ts           | 24 +++++++++----------
 1 file changed, 11 insertions(+), 13 deletions(-)

diff --git a/lib/modules/datasource/rubygems/versions-datasource.ts b/lib/modules/datasource/rubygems/versions-datasource.ts
index 07d5a09509..3a46e6bcba 100644
--- a/lib/modules/datasource/rubygems/versions-datasource.ts
+++ b/lib/modules/datasource/rubygems/versions-datasource.ts
@@ -10,7 +10,7 @@ import type { GetReleasesConfig, ReleaseResult } from '../types';
 
 interface RegistryCache {
   lastSync: Date;
-  packageReleases: Record<string, string[]>; // Because we might need a "constructor" key
+  packageReleases: Map<string, string[]>; // Because we might need a "constructor" key
   contentLength: number;
   isSupported: boolean;
   registryUrl: string;
@@ -25,7 +25,7 @@ export class VersionsDatasource extends Datasource {
     const cacheKey = `rubygems-versions-cache:${registryUrl}`;
     const regCache = memCache.get<RegistryCache>(cacheKey) ?? {
       lastSync: new Date('2000-01-01'),
-      packageReleases: {},
+      packageReleases: new Map<string, string[]>(),
       contentLength: 0,
       isSupported: false,
       registryUrl,
@@ -52,13 +52,12 @@ export class VersionsDatasource extends Datasource {
       throw new Error(PAGE_NOT_FOUND_ERROR);
     }
 
-    if (!regCache.packageReleases[packageName]) {
+    const versions = regCache.packageReleases.get(packageName);
+    if (!versions) {
       return null;
     }
 
-    const releases = regCache.packageReleases[packageName].map((version) => ({
-      version,
-    }));
+    const releases = versions.map((version) => ({ version }));
     return { releases };
   }
 
@@ -73,7 +72,7 @@ export class VersionsDatasource extends Datasource {
     const url = `${regCache.registryUrl}/versions`;
     const options = {
       headers: {
-        'accept-encoding': 'identity',
+        'accept-encoding': 'gzip',
         range: `bytes=${regCache.contentLength}-`,
       },
     };
@@ -92,7 +91,7 @@ export class VersionsDatasource extends Datasource {
       }
       if (err.statusCode !== 416) {
         regCache.contentLength = 0;
-        regCache.packageReleases = {};
+        regCache.packageReleases = new Map<string, string[]>();
         logger.debug({ err }, 'Rubygems fetch error');
         throw new ExternalHostError(new Error('Rubygems fetch error'));
       }
@@ -119,21 +118,20 @@ export class VersionsDatasource extends Datasource {
       split = l.split(' ');
       [pkg, versions] = split;
       pkg = VersionsDatasource.copystr(pkg);
-      regCache.packageReleases[pkg] ??= [];
+      let existingVersions = regCache.packageReleases.get(pkg) ?? [];
       const lineVersions = versions.split(',').map((version) => version.trim());
       for (const lineVersion of lineVersions) {
         if (lineVersion.startsWith('-')) {
           const deletedVersion = lineVersion.slice(1);
           logger.trace({ pkg, deletedVersion }, 'Rubygems: Deleting version');
-          regCache.packageReleases[pkg] = regCache.packageReleases[pkg].filter(
+          existingVersions = existingVersions.filter(
             (version) => version !== deletedVersion
           );
         } else {
-          regCache.packageReleases[pkg].push(
-            VersionsDatasource.copystr(lineVersion)
-          );
+          existingVersions.push(VersionsDatasource.copystr(lineVersion));
         }
       }
+      regCache.packageReleases.set(pkg, existingVersions);
     } catch (err) /* istanbul ignore next */ {
       logger.warn(
         { err, line, split, pkg, versions },
-- 
GitLab