Skip to content

Commit be4f6a5

Browse files
committed
Adding Response headers to CodeScan and reusing the uploadCode function
1 parent 26cd09e commit be4f6a5

File tree

5 files changed

+80
-38
lines changed

5 files changed

+80
-38
lines changed

packages/core/src/amazonqFeatureDev/session/sessionState.ts

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { getLogger } from '../../shared/logger'
1212
import { telemetry } from '../../shared/telemetry/telemetry'
1313
import { VirtualFileSystem } from '../../shared/virtualFilesystem'
1414
import { VirtualMemoryFile } from '../../shared/virtualMemoryFile'
15-
import { featureDevScheme } from '../constants'
15+
import { featureDevScheme, featureName } from '../constants'
1616
import { IllegalStateTransition, UserMessageNotFoundError } from '../errors'
1717
import {
1818
CurrentWsFolders,
@@ -73,8 +73,17 @@ export class PrepareRefinementState implements Omit<SessionState, 'uploadId'> {
7373
zipFileChecksum,
7474
zipFileBuffer.length
7575
)
76+
const requestHeaders = {
77+
'Content-Type': 'application/zip',
78+
'Content-Length': String(zipFileBuffer.length),
79+
'x-amz-checksum-sha256': zipFileChecksum,
80+
...(kmsKeyArn && {
81+
'x-amz-server-side-encryption-aws-kms-key-id': kmsKeyArn,
82+
'x-amz-server-side-encryption': 'aws:kms',
83+
}),
84+
}
7685

77-
await uploadCode(uploadUrl, zipFileBuffer, zipFileChecksum, kmsKeyArn)
86+
await uploadCode(uploadUrl, zipFileBuffer, requestHeaders, featureName)
7887
return uploadId
7988
})
8089
const nextState = new RefinementState({ ...this.config, uploadId }, this.approach, this.tabID, 0)
@@ -472,8 +481,17 @@ export class PrepareCodeGenState implements SessionState {
472481
zipFileChecksum,
473482
zipFileBuffer.length
474483
)
484+
const requestHeaders = {
485+
'Content-Type': 'application/zip',
486+
'Content-Length': String(zipFileBuffer.length),
487+
'x-amz-checksum-sha256': zipFileChecksum,
488+
...(kmsKeyArn && {
489+
'x-amz-server-side-encryption-aws-kms-key-id': kmsKeyArn,
490+
'x-amz-server-side-encryption': 'aws:kms',
491+
}),
492+
}
475493

476-
await uploadCode(uploadUrl, zipFileBuffer, zipFileChecksum, kmsKeyArn)
494+
await uploadCode(uploadUrl, zipFileBuffer, requestHeaders, featureName)
477495
return uploadId
478496
})
479497
this.uploadId = uploadId

packages/core/src/amazonqFeatureDev/util/upload.ts

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
import request, { RequestError } from '../../common/request'
77
import { getLogger } from '../../shared/logger/logger'
8-
import { featureName } from '../constants'
98

109
import { UploadCodeError } from '../errors'
1110

@@ -14,19 +13,11 @@ import { UploadCodeError } from '../errors'
1413
*
1514
* uses a presigned url and files checksum to transfer data to s3 through http.
1615
*/
17-
export async function uploadCode(url: string, buffer: Buffer, checksumSha256: string, kmsKeyArn?: string) {
16+
export async function uploadCode(url: string, buffer: Buffer, requestHeaders: any, featureName: string) {
1817
try {
1918
await request.fetch('PUT', url, {
2019
body: buffer,
21-
headers: {
22-
'Content-Type': 'application/zip',
23-
'Content-Length': String(buffer.length),
24-
'x-amz-checksum-sha256': checksumSha256,
25-
...(kmsKeyArn && {
26-
'x-amz-server-side-encryption-aws-kms-key-id': kmsKeyArn,
27-
'x-amz-server-side-encryption': 'aws:kms',
28-
}),
29-
},
20+
headers: requestHeaders,
3021
}).response
3122
} catch (e: any) {
3223
getLogger().error(`${featureName}: failed to upload code to s3: ${(e as Error).message}`)

packages/core/src/codewhisperer/client/service-2.json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,9 @@
583583
},
584584
"kmsKeyArn": {
585585
"shape": "ResourceArn"
586+
},
587+
"requestHeaders": {
588+
"shape": "RequestHeaders"
586589
}
587590
}
588591
},
@@ -1086,6 +1089,27 @@
10861089
"max": 1224,
10871090
"min": 0
10881091
},
1092+
"RequestHeaderKey": {
1093+
"type": "string",
1094+
"max": 64,
1095+
"min": 1
1096+
},
1097+
"RequestHeaderValue": {
1098+
"type": "string",
1099+
"max": 256,
1100+
"min": 1
1101+
},
1102+
"RequestHeaders": {
1103+
"type": "map",
1104+
"key": {
1105+
"shape": "RequestHeaderKey"
1106+
},
1107+
"value": {
1108+
"shape": "RequestHeaderValue"
1109+
},
1110+
"max": 16,
1111+
"min": 1
1112+
},
10891113
"ResourceNotFoundException": {
10901114
"type": "structure",
10911115
"required": ["message"],

packages/core/src/codewhisperer/client/user-service-2.json

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -598,7 +598,10 @@
598598
"members": {
599599
"uploadId": { "shape": "UploadId" },
600600
"uploadUrl": { "shape": "PreSignedUrl" },
601-
"kmsKeyArn": { "shape": "ResourceArn" }
601+
"kmsKeyArn": { "shape": "ResourceArn" },
602+
"requestHeaders": {
603+
"shape": "RequestHeaders"
604+
}
602605
}
603606
},
604607
"CursorState": {
@@ -1137,6 +1140,27 @@
11371140
"min": 0,
11381141
"pattern": "arn:([-.a-z0-9]{1,63}:){2}([-.a-z0-9]{0,63}:){2}([a-zA-Z0-9-_:/]){1,1023}"
11391142
},
1143+
"RequestHeaderKey": {
1144+
"type": "string",
1145+
"max": 64,
1146+
"min": 1
1147+
},
1148+
"RequestHeaderValue": {
1149+
"type": "string",
1150+
"max": 256,
1151+
"min": 1
1152+
},
1153+
"RequestHeaders": {
1154+
"type": "map",
1155+
"key": {
1156+
"shape": "RequestHeaderKey"
1157+
},
1158+
"value": {
1159+
"shape": "RequestHeaderValue"
1160+
},
1161+
"max": 16,
1162+
"min": 1
1163+
},
11401164
"ResourceNotFoundException": {
11411165
"type": "structure",
11421166
"required": ["message"],

packages/core/src/codewhisperer/service/securityScanHandler.ts

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ import { RawCodeScanIssue } from '../models/model'
1414
import * as crypto from 'crypto'
1515
import path = require('path')
1616
import { pageableToCollection } from '../../shared/utilities/collectionUtils'
17-
import { ArtifactMap, CreateUploadUrlRequest, CreateUploadUrlResponse } from '../client/codewhispereruserclient'
17+
import { ArtifactMap, CreateUploadUrlRequest } from '../client/codewhispereruserclient'
1818
import { Truncation } from '../util/dependencyGraph/dependencyGraph'
1919
import { TelemetryHelper } from '../util/telemetryHelper'
20-
import request from '../../common/request'
20+
import { uploadCode } from '../../amazonqFeatureDev/util/upload'
2121

2222
export async function listScanResults(
2323
client: DefaultCodeWhispererClient,
@@ -154,7 +154,12 @@ export async function getPresignedUrlAndUpload(client: DefaultCodeWhispererClien
154154
getLogger().verbose(`Request id: ${srcResp.$response.requestId}`)
155155
getLogger().verbose(`Complete Getting presigned Url for uploading src context.`)
156156
getLogger().verbose(`Uploading src context...`)
157-
await uploadArtifactToS3(truncation.zipFilePath, srcResp)
157+
await uploadCode(
158+
srcResp.uploadUrl,
159+
readFileSync(truncation.zipFilePath),
160+
srcResp.requestHeaders,
161+
'QCA SecurityScan'
162+
)
158163
getLogger().verbose(`Complete uploading src context.`)
159164
const artifactMap: ArtifactMap = {
160165
SourceCode: srcResp.uploadId,
@@ -173,23 +178,3 @@ export function throwIfCancelled() {
173178
throw new CodeScanStoppedError()
174179
}
175180
}
176-
177-
export async function uploadArtifactToS3(fileName: string, resp: CreateUploadUrlResponse) {
178-
const encryptionContext = `{"uploadId":"${resp.uploadId}"}`
179-
const headersObj: Record<string, string> = {
180-
'Content-MD5': getMd5(fileName),
181-
'x-amz-server-side-encryption': 'aws:kms',
182-
'Content-Type': 'application/zip',
183-
'x-amz-server-side-encryption-context': Buffer.from(encryptionContext, 'utf8').toString('base64'),
184-
}
185-
186-
if (resp.kmsKeyArn !== '' && resp.kmsKeyArn !== undefined) {
187-
headersObj['x-amz-server-side-encryption-aws-kms-key-id'] = resp.kmsKeyArn
188-
}
189-
190-
const response = await request.fetch('PUT', resp.uploadUrl, {
191-
body: readFileSync(fileName),
192-
headers: headersObj,
193-
}).response
194-
getLogger().debug(`StatusCode: ${response.status}, Text: ${response.statusText}`)
195-
}

0 commit comments

Comments
 (0)