(clientIP, request, response, log)
| 1704 | } |
| 1705 | |
| 1706 | function routeBackbeat(clientIP, request, response, log) { |
| 1707 | // Attach the apiMethod method to the request, so it can used by monitoring in the server |
| 1708 | // eslint-disable-next-line no-param-reassign |
| 1709 | request.apiMethod = 'routeBackbeat'; |
| 1710 | const contentLength = request.headers['x-amz-decoded-content-length'] || request.headers['content-length']; |
| 1711 | // eslint-disable-next-line no-param-reassign |
| 1712 | request.parsedContentLength = Number.parseInt(contentLength?.toString() ?? '', 10); |
| 1713 | |
| 1714 | log.debug('routing request'); |
| 1715 | _normalizeBackbeatRequest(request); |
| 1716 | |
| 1717 | log.addDefaultFields({ |
| 1718 | clientIP, |
| 1719 | url: request.url, |
| 1720 | method: 'routeBackbeat', |
| 1721 | resourceType: request.resourceType, |
| 1722 | bucketName: request.bucketName, |
| 1723 | objectKey: request.objectKey, |
| 1724 | bytesReceived: request.parsedContentLength || 0, |
| 1725 | bodyLength: parseInt(request.headers['content-length'], 10) || 0, |
| 1726 | }); |
| 1727 | if (request.serverAccessLog) { |
| 1728 | // eslint-disable-next-line no-param-reassign |
| 1729 | request.serverAccessLog.bucketName = request.bucketName; |
| 1730 | // eslint-disable-next-line no-param-reassign |
| 1731 | request.serverAccessLog.objectKey = request.objectKey; |
| 1732 | // eslint-disable-next-line no-param-reassign |
| 1733 | request.serverAccessLog.backbeat = true; |
| 1734 | // eslint-disable-next-line no-param-reassign |
| 1735 | request.serverAccessLog.analyticsAction = 'BACKBEAT_INVALID'; |
| 1736 | } |
| 1737 | |
| 1738 | const requestContexts = prepareRequestContexts('objectReplicate', request); |
| 1739 | |
| 1740 | if (request.resourceType === 'expiration' || request.resourceType === 'batchdelete') { |
| 1741 | // Reassign a specific apiMethod, as it is needed for quota evaluation (at least), where |
| 1742 | // "routeBackbeat" cannot be used as it is used for all backbeat API operations... |
| 1743 | // eslint-disable-next-line no-param-reassign |
| 1744 | request.apiMethod = 'objectDelete'; |
| 1745 | |
| 1746 | // Request account quotas, as it will not be added for the 'objectReplicate' action which |
| 1747 | // is used by default for all backbeat operations |
| 1748 | requestContexts.forEach(context => { |
| 1749 | context._needQuota = true; // eslint-disable-line no-param-reassign |
| 1750 | }); |
| 1751 | } |
| 1752 | |
| 1753 | // Ensure backbeat operations like expiration can properly use quotas |
| 1754 | // eslint-disable-next-line no-param-reassign |
| 1755 | request.finalizerHooks = []; |
| 1756 | |
| 1757 | // Extract all the _apiMethods and store them in an array |
| 1758 | const apiMethods = requestContexts ? requestContexts.map(context => context._apiMethod) : []; |
| 1759 | // Attach the names to the current request |
| 1760 | // eslint-disable-next-line no-param-reassign |
| 1761 | request.apiMethods = apiMethods; |
| 1762 | |
| 1763 | // proxy api requests to Backbeat API server |
no test coverage detected