async function getPackageRepo()

in generate-attribution/generate-attribution-file.js [209:254]


async function getPackageRepo(package) {
    let finalDoc = '';
    let url = `https://${package}?go-get=1`
    const options = await generateAuthorizationHeader()
    options.timeout = 15 * 1000
    return cacheHttp(url, async (bail, num) => {
        try {
            // Github doesnt seem to return the go-import for sub packages, only request for root packages
            if (package.startsWith('github.com') && package.split("/").length > 3) {
                return parseRepoURL(`https://${package}`);
            }
            const res = await get(url, options);
            res.on('data', d => {
                finalDoc += d;
            });

            await res.end;

            if (res.statusCode === 429) {
                throw new Error("Rate limited");
            }
            if (res.statusCode === 404) {
                console.log('NOTICE: request to get package url return invalid response', res.statusCode, url);
                return `https://${package}`;
            }
            if (res.statusCode !== 200) {
                throw new Error("invalid response", res.statusCode);
            }

            const htmlDoc = HTMLParser.parse(finalDoc);
            const metaTag = htmlDoc.querySelector('head meta[name=go-import]')
            if (metaTag) {
                return parseRepoURL(metaTag.getAttribute('content'));
            }
            else {
                return `https://${package}`;
            }
        } catch (err) {
            // if the domain is not resolved, only retry 3 times
            if (err.code === 'ENOTFOUND' && num > 2) {
                return bail(err);
            }
            throw err
        }
    });
}