提交 f4f7d48e 编写于 作者: T Tomas Vik

feat: include user-agent header in all API requets

上级 61ce26eb
......@@ -5,6 +5,7 @@ import { URL } from 'url';
import * as createHttpProxyAgent from 'https-proxy-agent';
import { tokenService } from '../services/token_service';
import { FetchError } from '../errors/fetch_error';
import { getUserAgentHeader } from '../utils/get_user_agent_header';
interface Node<T> {
nodes: T[];
......@@ -51,12 +52,6 @@ const queryGetSnippets = gql`
}
`;
const getUserAgent = () => {
const extension = vscode.extensions.getExtension('GitLab.gitlab-workflow');
const packageJson: Record<string, string | undefined> = extension?.packageJSON;
return `vs-code-gitlab-workflow/${packageJson.version}`;
};
export class GitLabNewService {
client: GraphQLClient;
......@@ -75,7 +70,7 @@ export class GitLabNewService {
return {
headers: {
Authorization: `Bearer ${token}`,
'User-Agent': getUserAgent(),
...getUserAgentHeader(),
},
agent,
};
......
......@@ -8,6 +8,7 @@ const { ApiError } = require('./errors/api_error');
const { getCurrentWorkspaceFolder } = require('./services/workspace_service');
const { createGitService } = require('./git_service_factory');
const { handleError, logError } = require('./log');
const { getUserAgentHeader } = require('./utils/get_user_agent_header');
const projectCache = [];
let versionCache = null;
......@@ -44,6 +45,7 @@ async function fetch(path, method = 'GET', data = null) {
method,
headers: {
'PRIVATE-TOKEN': glToken,
...getUserAgentHeader(),
},
ecdhCurve: 'auto',
rejectUnauthorized: !ignoreCertificateErrors,
......
......@@ -27,7 +27,7 @@ export class TokenService {
return this.glTokenMap[instanceUrl];
}
setToken(instanceUrl: string, token: string | undefined) {
async setToken(instanceUrl: string, token: string | undefined) {
assert(this.context);
const tokenMap = this.glTokenMap;
......@@ -37,7 +37,7 @@ export class TokenService {
delete tokenMap[instanceUrl];
}
this.context.globalState.update('glTokens', tokenMap);
await this.context.globalState.update('glTokens', tokenMap);
this.onDidChangeEmitter.fire();
}
}
......
......@@ -17,7 +17,7 @@ async function showInput() {
});
if (instance && token) {
tokenService.setToken(instance, token);
await tokenService.setToken(instance, token);
}
}
......@@ -29,7 +29,7 @@ async function removeTokenPicker() {
});
if (selectedInstanceUrl) {
tokenService.setToken(selectedInstanceUrl, undefined);
await tokenService.setToken(selectedInstanceUrl, undefined);
}
}
......
import * as vscode from 'vscode';
export const getUserAgentHeader = (): Record<string, string> => {
const extension = vscode.extensions.getExtension('GitLab.gitlab-workflow');
const extensionVersion = extension?.packageJSON?.version;
const nodePlatform = `Node.js/${process.version.substr(1)} (${process.platform}; ${
process.arch
})`;
const vsCodeVersion = vscode.version;
return {
'User-Agent': `vs-code-gitlab-workflow/${extensionVersion} VSCode/${vsCodeVersion} ${nodePlatform}`,
};
};
......@@ -5,7 +5,7 @@ const simpleGit = require('simple-git');
const { insertSnippet } = require('../../src/commands/insert_snippet');
const { tokenService } = require('../../src/services/token_service');
const getServer = require('./test_infrastructure/mock_server');
const { GITLAB_HOST, REMOTE } = require('./test_infrastructure/constants');
const { GITLAB_URL, REMOTE } = require('./test_infrastructure/constants');
const {
createAndOpenFile,
closeAndDeleteFile,
......@@ -17,9 +17,9 @@ describe('Insert snippet', async () => {
let testFileUri;
const sandbox = sinon.createSandbox();
before(() => {
before(async () => {
server = getServer();
tokenService.setToken(`https://${GITLAB_HOST}`, 'abcd-secret');
await tokenService.setToken(GITLAB_URL, 'abcd-secret');
});
beforeEach(async () => {
......@@ -36,9 +36,9 @@ describe('Insert snippet', async () => {
await closeAndDeleteFile(testFileUri);
});
after(() => {
after(async () => {
server.close();
tokenService.setToken(`https://${GITLAB_HOST}`, undefined);
await tokenService.setToken(GITLAB_URL, undefined);
});
it('inserts snippet when there is only one blob', async () => {
......
......@@ -4,7 +4,7 @@ const vscode = require('vscode');
const statusBar = require('../../src/status_bar');
const { tokenService } = require('../../src/services/token_service');
const getServer = require('./test_infrastructure/mock_server');
const { GITLAB_HOST } = require('./test_infrastructure/constants');
const { GITLAB_URL } = require('./test_infrastructure/constants');
describe('GitLab status bar', () => {
let server;
......@@ -17,9 +17,9 @@ describe('GitLab status bar', () => {
return fakeItem;
};
before(() => {
before(async () => {
server = getServer();
tokenService.setToken(`https://${GITLAB_HOST}`, 'abcd-secret');
await tokenService.setToken(GITLAB_URL, 'abcd-secret');
});
beforeEach(() => {
......@@ -33,9 +33,9 @@ describe('GitLab status bar', () => {
returnedItems = [];
});
after(() => {
after(async () => {
server.close();
tokenService.setToken(`https://${GITLAB_HOST}`, undefined);
await tokenService.setToken(GITLAB_URL, undefined);
});
it('shows the correct pipeline item', async () => {
......
export const GITLAB_HOST = 'test.gitlab.com';
export const GITLAB_URL = 'https://test.gitlab.com';
export const API_URL_PREFIX = `${GITLAB_URL}/api/v4`;
export const REMOTE = {
NAME: 'origin',
URL: 'git@test.gitlab.com:gitlab-org/gitlab.git',
......
const { setupServer } = require('msw/node');
const { rest, graphql } = require('msw');
const { GITLAB_HOST } = require('./constants');
const { API_URL_PREFIX } = require('./constants');
const projectResponse = require('../fixtures/rest/project.json');
const versionResponse = require('../fixtures/rest/version.json');
const openIssueResponse = require('../fixtures/rest/open_issue.json');
......@@ -9,15 +9,13 @@ const pipelinesResponse = require('../fixtures/rest/pipelines.json');
const pipelineResponse = require('../fixtures/rest/pipeline.json');
const snippetsResponse = require('../fixtures/graphql/snippets.json');
const instancePrefix = `https://${GITLAB_HOST}/api/v4`;
const createJsonEndpoint = (path, response) =>
rest.get(`${instancePrefix}${path}`, (req, res, ctx) => {
rest.get(`${API_URL_PREFIX}${path}`, (req, res, ctx) => {
return res(ctx.status(200), ctx.json(response));
});
const createTextEndpoint = (path, response) =>
rest.get(`${instancePrefix}${path}`, (req, res, ctx) => {
rest.get(`${API_URL_PREFIX}${path}`, (req, res, ctx) => {
return res(ctx.status(200), ctx.text(response));
});
......
......@@ -2,15 +2,15 @@ const assert = require('assert');
const IssuableDataProvider = require('../../src/data_providers/issuable').DataProvider;
const { tokenService } = require('../../src/services/token_service');
const getServer = require('./test_infrastructure/mock_server');
const { GITLAB_HOST } = require('./test_infrastructure/constants');
const { GITLAB_URL } = require('./test_infrastructure/constants');
describe('GitLab tree view', () => {
let server;
let dataProvider;
before(() => {
before(async () => {
server = getServer();
tokenService.setToken(`https://${GITLAB_HOST}`, 'abcd-secret');
await tokenService.setToken(GITLAB_URL, 'abcd-secret');
});
beforeEach(() => {
......@@ -18,9 +18,9 @@ describe('GitLab tree view', () => {
dataProvider = new IssuableDataProvider();
});
after(() => {
after(async () => {
server.close();
tokenService.setToken(`https://${GITLAB_HOST}`, undefined);
await tokenService.setToken(GITLAB_URL, undefined);
});
/**
......
const { setupServer } = require('msw/node');
const { rest, graphql } = require('msw');
const assert = require('assert');
const { API_URL_PREFIX, GITLAB_URL } = require('./test_infrastructure/constants');
const { tokenService } = require('../../src/services/token_service');
const gitLabService = require('../../src/gitlab_service');
const { GitLabNewService } = require('../../src/gitlab/gitlab_new_service');
const snippetsResponse = require('./fixtures/graphql/snippets.json');
const validateUserAgent = req => {
const userAgent = req.headers.get('User-Agent');
assert(
userAgent.startsWith('vs-code-gitlab-workflow/'),
`User-Agent header ${userAgent} must start with vs-code-gitlab-workflow/`,
);
};
describe('User-Agent header', () => {
let server;
let capturedRequest;
before(async () => {
server = setupServer(
rest.get(`${API_URL_PREFIX}/user`, (req, res, ctx) => {
capturedRequest = req;
return res(ctx.status(200), ctx.json({}));
}),
graphql.query('GetSnippets', (req, res, ctx) => {
capturedRequest = req;
return res(ctx.data(snippetsResponse));
}),
);
server.listen();
await tokenService.setToken(GITLAB_URL, 'abcd-secret');
});
beforeEach(() => {
server.resetHandlers();
capturedRequest = undefined;
});
after(async () => {
server.close();
await tokenService.setToken(GITLAB_URL, undefined);
});
it('is sent with requests from GitLabService', async () => {
await gitLabService.fetchCurrentUser();
validateUserAgent(capturedRequest);
});
it('is sent with requests from GitLabNewService', async () => {
const subject = new GitLabNewService(GITLAB_URL);
await subject.getSnippets('gitlab-org/gitlab');
validateUserAgent(capturedRequest);
});
});
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册