Skip to content

Commit 083abed

Browse files
CR-18923 CF_DOCKERFILE_CONTENT payload too large for EventSource (#89)
* CR-18923 CF_DOCKERFILE_CONTENT payload too large for EventSource * CR-18923 CF_DOCKERFILE_CONTENT payload too large for EventSource * CR-18923 CF_DOCKERFILE_CONTENT payload too large for EventSource * CR-18923 CF_DOCKERFILE_CONTENT payload too large for EventSource * CR-18923 CF_DOCKERFILE_CONTENT payload too large for EventSource * CR-18923 CF_DOCKERFILE_CONTENT payload too large for EventSource * CR-18923 CF_DOCKERFILE_CONTENT payload too large for EventSource * CR-18923 CF_DOCKERFILE_CONTENT payload too large for EventSource * CR-18923 CF_DOCKERFILE_CONTENT payload too large for EventSource * CR-18923 CF_DOCKERFILE_CONTENT payload too large for EventSource * CR-18923 CF_DOCKERFILE_CONTENT payload too large for EventSource * CR-18923 CF_DOCKERFILE_CONTENT payload too large for EventSource * CR-18923 bump version * CR-18923 bump version
1 parent 44292ca commit 083abed

File tree

3 files changed

+51
-9
lines changed

3 files changed

+51
-9
lines changed

service.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
name: codefresh-report-image
2-
version: 0.0.160
2+
version: 0.0.161

src/__tests__/request-builder.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ describe('request builder test', () => {
1313

1414
it('support CF_RUNTIME_NAME', async () => {
1515
const ingressHost = 'https://my.codefresh.ingress'
16-
jest.spyOn(Utils, 'getRuntimeIngressHost').mockResolvedValue(ingressHost)
16+
jest.spyOn(Utils, 'getRuntimeInfo').mockResolvedValue({ ingressHost, runtimeVersion: '' })
1717
const { url, headers } = await Utils.buildUrlHeaders({
1818
'CF_API_KEY': 'the-token',
1919
'CF_RUNTIME_NAME': 'runtime',

src/utils.ts

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,97 @@
11
import { GraphQLClient, gql } from 'graphql-request'
22
import { get } from 'lodash'
3+
import { gte } from 'semver'
34

5+
import { deflate } from 'zlib'
46
import { errors } from './errors'
7+
import { promisify } from 'util'
8+
import { logger } from './logger'
9+
10+
11+
const deflateAsync = promisify(deflate)
512

613
export namespace Utils {
714
/**
815
* Build image-report url and headers
916
* @param payload
1017
*/
1118
export async function buildUrlHeaders(payload: Record<string, string | undefined>): Promise<{ url: string, headers: { authorization: string } }> {
12-
const esc = encodeURIComponent
1319
const headers = { 'authorization': payload['CF_API_KEY']! }
1420
const runtimeName = payload['CF_RUNTIME_NAME']
1521
let host
22+
let runtimeVersion
1623
if (!runtimeName) {
1724
host = payload['CF_HOST']
1825
delete payload['CF_HOST']
1926
} else {
20-
const platformHost = payload['CF_PLATFORM_URL']
21-
host = await Utils.getRuntimeIngressHost(runtimeName, headers, platformHost)
27+
const platformHost = payload['CF_PLATFORM_URL'] || 'https://g.codefresh.io'
28+
const runtimeInfo = await Utils.getRuntimeInfo(runtimeName, headers, platformHost)
29+
host = runtimeInfo.ingressHost
30+
runtimeVersion = runtimeInfo.runtimeVersion
2231
delete payload['CF_RUNTIME_NAME']
2332
delete payload['CF_PLATFORM_URL']
2433
}
2534
delete payload['CF_API_KEY']
26-
const qs = Object.entries(payload).map(kv => `${esc(kv[0])}=${esc(kv[1] || '')}`).join('&')
35+
let qs
36+
const shouldCompressData = runtimeVersion && gte(removeReleaseCandidatePrefixFromRuntimeVersion(runtimeVersion), '0.1.33')
37+
if (shouldCompressData) {
38+
logger.info('Using new query string format')
39+
qs = await this.getQueryStringCompressed(payload)
40+
} else {
41+
qs = this.getQueryString(payload)
42+
}
43+
2744
const url = `${host}/app-proxy/api/image-report?${qs}`
2845
if (payload['CF_LOCAL']) {
2946
return { url: `${host}/api/image-report?${qs}`, headers }
3047
}
3148
return { url, headers }
3249
}
3350

34-
export async function getRuntimeIngressHost(runtimeName: string, headers: Record<string, string>, platformHost = 'https://g.codefresh.io'): Promise<string> {
51+
export async function getRuntimeInfo(runtimeName: string, headers: Record<string, string>, platformHost): Promise<{ ingressHost: string, runtimeVersion: string }> {
3552
const graphQLClient = new GraphQLClient(`${platformHost}/2.0/api/graphql`, {
3653
headers
3754
})
3855

3956
const getRuntimeIngressHostQuery = gql`
4057
query Runtime($name: String!) {
4158
runtime(name: $name) {
42-
ingressHost
59+
ingressHost,
60+
runtimeVersion
4361
}
4462
}`
4563

4664
const res = await graphQLClient.request(getRuntimeIngressHostQuery, { name: runtimeName })
4765
const ingressHost = get(res, 'runtime.ingressHost')
66+
const runtimeVersion = get(res, 'runtime.runtimeVersion', '')
4867
if (!ingressHost) {
4968
const message = res.runtime ? `ingress host is not defined on your '${runtimeName}' runtime` : `runtime '${runtimeName}' does not exist`
5069
throw new errors.ValidationError(message)
5170
}
52-
return ingressHost
71+
return { ingressHost, runtimeVersion }
72+
}
73+
74+
export async function getQueryStringCompressed(payload: Record<string, string | undefined>): Promise<string> {
75+
logger.debug('Start encoding variables')
76+
const dockerfile = payload['CF_DOCKERFILE_CONTENT']
77+
if (dockerfile) {
78+
const compressedDockerfile = await deflateAsync(Buffer.from(dockerfile, 'base64'), { level: 9, strategy: 0 })
79+
payload['CF_DOCKERFILE_CONTENT'] = compressedDockerfile.toString('base64')
80+
}
81+
const qs = this.getQueryString(payload)
82+
const compressedPayload = await deflateAsync(Buffer.from(qs), { level: 9, strategy: 0 })
83+
const data = compressedPayload.toString('base64')
84+
logger.debug('Variables successfully encoded')
85+
return `data=${encodeURIComponent(data)}`
86+
}
87+
88+
export function getQueryString(payload: Record<string, string | undefined>) {
89+
return Object.entries(payload).map(kv => `${encodeURIComponent(kv[0])}=${encodeURIComponent(kv[1] || '')}`).join('&')
90+
}
91+
92+
export function removeReleaseCandidatePrefixFromRuntimeVersion(runtimeVersion: string): string {
93+
const [ runtimeVersionWithoutReleaseCandidatePrefix ] = runtimeVersion.split('-')
94+
return runtimeVersionWithoutReleaseCandidatePrefix
5395
}
5496

5597
export function tryParseJson (str: string) {

0 commit comments

Comments
 (0)