diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e6191e1f78..dc8bc2ba383 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - An invalid project/org handling in webhooks () - Warning `key` is undefined on project page () +- Cloud storage content listing when the manifest name contains special characters + () ### Security - TDB diff --git a/cvat-core/package.json b/cvat-core/package.json index c2e4f211209..1d0462df107 100644 --- a/cvat-core/package.json +++ b/cvat-core/package.json @@ -1,6 +1,6 @@ { "name": "cvat-core", - "version": "9.0.0", + "version": "9.0.1", "description": "Part of Computer Vision Tool which presents an interface for client-side integration", "main": "src/api.ts", "scripts": { diff --git a/cvat-core/src/server-proxy.ts b/cvat-core/src/server-proxy.ts index cd384084194..b8cb092e954 100644 --- a/cvat-core/src/server-proxy.ts +++ b/cvat-core/src/server-proxy.ts @@ -365,7 +365,7 @@ async function register( ): Promise { let response = null; try { - const data = JSON.stringify({ + response = await Axios.post(`${config.backendAPI}/auth/register`, { username, first_name: firstName, last_name: lastName, @@ -374,11 +374,6 @@ async function register( password2: password, confirmations, }); - response = await Axios.post(`${config.backendAPI}/auth/register`, data, { - headers: { - 'Content-Type': 'application/json', - }, - }); setAuthData(response); } catch (errorData) { throw generateError(errorData); @@ -413,16 +408,11 @@ async function logout(): Promise { async function changePassword(oldPassword: string, newPassword1: string, newPassword2: string): Promise { try { - const data = JSON.stringify({ + await Axios.post(`${config.backendAPI}/auth/password/change`, { old_password: oldPassword, new_password1: newPassword1, new_password2: newPassword2, }); - await Axios.post(`${config.backendAPI}/auth/password/change`, data, { - headers: { - 'Content-Type': 'application/json', - }, - }); } catch (errorData) { throw generateError(errorData); } @@ -430,14 +420,9 @@ async function changePassword(oldPassword: string, newPassword1: string, newPass async function requestPasswordReset(email: string): Promise { try { - const data = JSON.stringify({ + await Axios.post(`${config.backendAPI}/auth/password/reset`, { email, }); - await Axios.post(`${config.backendAPI}/auth/password/reset`, data, { - headers: { - 'Content-Type': 'application/json', - }, - }); } catch (errorData) { throw generateError(errorData); } @@ -445,17 +430,12 @@ async function requestPasswordReset(email: string): Promise { async function resetPassword(newPassword1: string, newPassword2: string, uid: string, _token: string): Promise { try { - const data = JSON.stringify({ + await Axios.post(`${config.backendAPI}/auth/password/reset/confirm`, { new_password1: newPassword1, new_password2: newPassword2, uid, token: _token, }); - await Axios.post(`${config.backendAPI}/auth/password/reset/confirm`, data, { - headers: { - 'Content-Type': 'application/json', - }, - }); } catch (errorData) { throw generateError(errorData); } @@ -564,10 +544,7 @@ async function healthCheck( async function serverRequest(url: string, data: object): Promise { try { - const res = await Axios({ - url, - ...data, - }); + const res = await Axios(url, data); return res; } catch (errorData) { throw generateError(errorData); @@ -628,11 +605,7 @@ async function saveProject(id: number, projectData: Partial): let response = null; try { - response = await Axios.patch(`${backendAPI}/projects/${id}`, JSON.stringify(projectData), { - headers: { - 'Content-Type': 'application/json', - }, - }); + response = await Axios.patch(`${backendAPI}/projects/${id}`, projectData); } catch (errorData) { throw generateError(errorData); } @@ -654,11 +627,7 @@ async function createProject(projectSpec: SerializedProject): Promise): Promise< let response = null; try { - response = await Axios.patch(`${backendAPI}/tasks/${id}`, JSON.stringify(taskData), { - headers: { - 'Content-Type': 'application/json', - }, - }); + response = await Axios.patch(`${backendAPI}/tasks/${id}`, taskData); } catch (errorData) { throw generateError(errorData); } @@ -714,9 +679,8 @@ async function deleteTask(id: number, organizationID: string | null = null): Pro try { await Axios.delete(`${backendAPI}/tasks/${id}`, { - ...(organizationID ? { org: organizationID } : {}), - headers: { - 'Content-Type': 'application/json', + params: { + ...(organizationID ? { org: organizationID } : {}), }, }); } catch (errorData) { @@ -739,7 +703,7 @@ async function getLabels(filter: { async function deleteLabel(id: number): Promise { const { backendAPI } = config; try { - await Axios.delete(`${backendAPI}/labels/${id}`, { method: 'DELETE' }); + await Axios.delete(`${backendAPI}/labels/${id}`); } catch (errorData) { throw generateError(errorData); } @@ -749,7 +713,7 @@ async function updateLabel(id: number, body: SerializedLabel): Promise): Promise { let response = null; try { - response = await Axios.get(`${backendAPI}/${session}s/${jid}/data/meta`, { - }); + response = await Axios.get(`${backendAPI}/${session}s/${jid}/data/meta`); } catch (errorData) { throw generateError(errorData); } @@ -1603,8 +1548,7 @@ async function getFunctionProviders() { const { backendAPI } = config; try { - const response = await Axios.get(`${backendAPI}/functions/info`, { - }); + const response = await Axios.get(`${backendAPI}/functions/info`); return response.data; } catch (errorData) { if (errorData.response.status === 404) { @@ -1618,11 +1562,7 @@ async function deleteFunction(functionId: number) { const { backendAPI } = config; try { - await Axios.delete(`${backendAPI}/functions/${functionId}`, { - headers: { - 'Content-Type': 'application/json', - }, - }); + await Axios.delete(`${backendAPI}/functions/${functionId}`); } catch (errorData) { throw generateError(errorData); } @@ -1633,23 +1573,18 @@ async function updateAnnotations(session, id, data, action) { const { backendAPI } = config; const url = `${backendAPI}/${session}s/${id}/annotations`; const params = {}; - let requestFunc = null; + let method: string; if (action.toUpperCase() === 'PUT') { - requestFunc = Axios.put.bind(Axios); + method = 'PUT'; } else { - requestFunc = Axios.patch.bind(Axios); + method = 'PATCH'; params.action = action; } let response = null; try { - response = await requestFunc(url, JSON.stringify(data), { - params, - headers: { - 'Content-Type': 'application/json', - }, - }); + response = await Axios(url, { method, data, params }); } catch (errorData) { throw generateError(errorData); } @@ -1660,11 +1595,7 @@ async function runFunctionRequest(body) { const { backendAPI } = config; try { - const response = await Axios.post(`${backendAPI}/functions/requests/`, JSON.stringify(body), { - headers: { - 'Content-Type': 'application/json', - }, - }); + const response = await Axios.post(`${backendAPI}/functions/requests/`, body); return response.data; } catch (errorData) { @@ -1767,45 +1698,11 @@ async function getFunctionRequestStatus(requestID) { } } -// Session is 'task' or 'job' -async function dumpAnnotations(id, name, format) { - const { backendAPI } = config; - const baseURL = `${backendAPI}/tasks/${id}/annotations`; - const params = enableOrganization(); - params.format = encodeURIComponent(format); - if (name) { - const filename = name.replace(/\//g, '_'); - params.filename = encodeURIComponent(filename); - } - - return new Promise((resolve, reject) => { - async function request() { - Axios.get(baseURL, { - params, - }) - .then((response) => { - if (response.status === 202) { - setTimeout(request, 3000); - } else { - params.action = 'download'; - resolve(`${baseURL}?${new URLSearchParams(params).toString()}`); - } - }) - .catch((errorData) => { - reject(generateError(errorData)); - }); - } - setTimeout(request); - }); -} - async function cancelFunctionRequest(requestId: string): Promise { const { backendAPI } = config; try { - await Axios.delete(`${backendAPI}/functions/requests/${requestId}`, { - method: 'DELETE', - }); + await Axios.delete(`${backendAPI}/functions/requests/${requestId}`); } catch (errorData) { throw generateError(errorData); } @@ -1816,11 +1713,8 @@ async function createFunction(functionData: any) { const { backendAPI } = config; try { - const response = await Axios.post(`${backendAPI}/functions`, JSON.stringify(functionData), { + const response = await Axios.post(`${backendAPI}/functions`, functionData, { params, - headers: { - 'Content-Type': 'application/json', - }, }); return response.data; } catch (errorData) { @@ -1832,12 +1726,7 @@ async function saveEvents(events) { const { backendAPI } = config; try { - await Axios.post(`${backendAPI}/events`, JSON.stringify(events), { - proxy: config.proxy, - headers: { - 'Content-Type': 'application/json', - }, - }); + await Axios.post(`${backendAPI}/events`, events); } catch (errorData) { throw generateError(errorData); } @@ -1847,12 +1736,7 @@ async function callFunction(funId, body) { const { backendAPI } = config; try { - const response = await Axios.post(`${backendAPI}/functions/${funId}/run`, JSON.stringify(body), { - headers: { - 'Content-Type': 'application/json', - }, - }); - + const response = await Axios.post(`${backendAPI}/functions/${funId}/run`, body); return response.data; } catch (errorData) { throw generateError(errorData); @@ -1891,11 +1775,7 @@ async function runLambdaRequest(body) { const { backendAPI } = config; try { - const response = await Axios.post(`${backendAPI}/lambda/requests`, JSON.stringify(body), { - headers: { - 'Content-Type': 'application/json', - }, - }); + const response = await Axios.post(`${backendAPI}/lambda/requests`, body); return response.data; } catch (errorData) { @@ -1907,11 +1787,7 @@ async function callLambdaFunction(funId, body) { const { backendAPI } = config; try { - const response = await Axios.post(`${backendAPI}/lambda/functions/${funId}`, JSON.stringify(body), { - headers: { - 'Content-Type': 'application/json', - }, - }); + const response = await Axios.post(`${backendAPI}/lambda/functions/${funId}`, body); return response.data; } catch (errorData) { @@ -1945,9 +1821,7 @@ async function cancelLambdaRequest(requestId) { const { backendAPI } = config; try { - await Axios.delete(`${backendAPI}/lambda/requests/${requestId}`, { - method: 'DELETE', - }); + await Axios.delete(`${backendAPI}/lambda/requests/${requestId}`); } catch (errorData) { throw generateError(errorData); } @@ -2010,10 +1884,12 @@ async function getCloudStorageContent(id, manifestPath) { let response = null; try { - const url = `${backendAPI}/cloudstorages/${id}/content${ - manifestPath ? `?manifest_path=${manifestPath}` : '' - }`; - response = await Axios.get(url); + const url = `${backendAPI}/cloudstorages/${id}/content`; + response = await Axios.get(url, { + params: { + ...(manifestPath ? { manifest_path: manifestPath } : {}), + }, + }); } catch (errorData) { throw generateError(errorData); } @@ -2063,11 +1939,8 @@ async function createOrganization(data) { let response = null; try { - response = await Axios.post(`${backendAPI}/organizations`, JSON.stringify(data), { + response = await Axios.post(`${backendAPI}/organizations`, data, { params: { org: '' }, - headers: { - 'Content-Type': 'application/json', - }, }); } catch (errorData) { throw generateError(errorData); @@ -2081,11 +1954,7 @@ async function updateOrganization(id, data) { let response = null; try { - response = await Axios.patch(`${backendAPI}/organizations/${id}`, JSON.stringify(data), { - headers: { - 'Content-Type': 'application/json', - }, - }); + response = await Axios.patch(`${backendAPI}/organizations/${id}`, data); } catch (errorData) { throw generateError(errorData); } @@ -2097,11 +1966,7 @@ async function deleteOrganization(id) { const { backendAPI } = config; try { - await Axios.delete(`${backendAPI}/organizations/${id}`, { - headers: { - 'Content-Type': 'application/json', - }, - }); + await Axios.delete(`${backendAPI}/organizations/${id}`); } catch (errorData) { throw generateError(errorData); } @@ -2146,12 +2011,7 @@ async function updateOrganizationMembership(membershipId, data) { const { backendAPI } = config; let response = null; try { - response = await Axios.patch( - `${backendAPI}/memberships/${membershipId}`, - { - ...data, - }, - ); + response = await Axios.patch(`${backendAPI}/memberships/${membershipId}`, data); } catch (errorData) { throw generateError(errorData); } @@ -2188,9 +2048,6 @@ async function getWebhookDelivery(webhookID: number, deliveryID: number): Promis try { const response = await Axios.get(`${backendAPI}/webhooks/${webhookID}/deliveries/${deliveryID}`, { params, - headers: { - 'Content-Type': 'application/json', - }, }); return response.data; } catch (errorData) { @@ -2209,9 +2066,6 @@ async function getWebhooks(filter, pageSize = 10): Promise { ...filter, page_size: pageSize, }, - headers: { - 'Content-Type': 'application/json', - }, }); response.data.results.count = response.data.count; @@ -2226,11 +2080,8 @@ async function createWebhook(webhookData: any): Promise { const { backendAPI } = config; try { - const response = await Axios.post(`${backendAPI}/webhooks`, JSON.stringify(webhookData), { + const response = await Axios.post(`${backendAPI}/webhooks`, webhookData, { params, - headers: { - 'Content-Type': 'application/json', - }, }); return response.data; } catch (errorData) { @@ -2243,13 +2094,9 @@ async function updateWebhook(webhookID: number, webhookData: any): Promise const { backendAPI } = config; try { - const response = await Axios - .patch(`${backendAPI}/webhooks/${webhookID}`, JSON.stringify(webhookData), { - params, - headers: { - 'Content-Type': 'application/json', - }, - }); + const response = await Axios.patch(`${backendAPI}/webhooks/${webhookID}`, webhookData, { + params, + }); return response.data; } catch (errorData) { throw generateError(errorData); @@ -2263,9 +2110,6 @@ async function deleteWebhook(webhookID: number): Promise { try { await Axios.delete(`${backendAPI}/webhooks/${webhookID}`, { params, - headers: { - 'Content-Type': 'application/json', - }, }); } catch (errorData) { throw generateError(errorData); @@ -2293,9 +2137,6 @@ async function pingWebhook(webhookID: number): Promise { try { const response = await Axios.post(`${backendAPI}/webhooks/${webhookID}/ping`, { params, - headers: { - 'Content-Type': 'application/json', - }, }); const deliveryID = response.data.id; @@ -2314,9 +2155,6 @@ async function receiveWebhookEvents(type: WebhookSourceType): Promise params: { type, }, - headers: { - 'Content-Type': 'application/json', - }, }); return response.data.events; } catch (errorData) { @@ -2398,7 +2236,6 @@ export default Object.freeze({ annotations: Object.freeze({ updateAnnotations, getAnnotations, - dumpAnnotations, uploadAnnotations, }),