@@ -18,6 +18,14 @@ import { supportsBuildContexts } from './dockerfileUtils';
1818import { ContainerError } from '../spec-common/errors' ;
1919import { requestResolveHeaders } from '../spec-utils/httpRequest' ;
2020
21+ // Constants for DockerHub registry access check
22+ const DOCKERHUB_AUTH_URL = 'https://auth.docker.io/token?service=registry.docker.io&scope=repository:docker/dockerfile:pull&tag=1.4' ;
23+ const DOCKERHUB_REGISTRY_URL = 'https://registry-1.docker.io/v2/docker/dockerfile/manifests/1.4' ;
24+ const DEVCONTAINER_USER_AGENT = 'devcontainer' ;
25+ const DOCKER_MANIFEST_ACCEPT_HEADER = 'application/vnd.docker.distribution.manifest.v2+json' ;
26+ const DOCKERFILE_FRONTEND_CHECK_MAX_RETRIES = 5 ;
27+ const DOCKERFILE_FRONTEND_CHECK_RETRY_INTERVAL_MS = 2000 ;
28+
2129// Escapes environment variable keys.
2230//
2331// Environment variables must contain:
@@ -223,13 +231,13 @@ function getOmitDevcontainerPropertyOverride(resolverParams: { omitConfigRemotEn
223231 return [ ] ;
224232}
225233
226- async function checkDockerfileFrontendAccessibleOrThrow ( params : DockerResolverParameters ) : Promise < void > {
234+ async function checkDockerfileFrontendAccessible ( params : DockerResolverParameters ) : Promise < void > {
227235 const { output } = params . common ;
228236
229237 const tokenRes = await requestResolveHeaders ( {
230238 type : 'GET' ,
231- url : 'https://auth.docker.io/token?service=registry.docker.io&scope=repository:docker/dockerfile:pull&tag=1.4' ,
232- headers : { 'user-agent' : 'devcontainer' }
239+ url : DOCKERHUB_AUTH_URL ,
240+ headers : { 'user-agent' : DEVCONTAINER_USER_AGENT }
233241 } , output ) ;
234242 if ( ! tokenRes || tokenRes . statusCode !== 200 ) {
235243 throw new Error ( 'Token fetch failed: status ' + ( tokenRes ?. statusCode ?? 'unknown' ) ) ;
@@ -248,11 +256,11 @@ async function checkDockerfileFrontendAccessibleOrThrow(params: DockerResolverPa
248256
249257 const manifestRes = await requestResolveHeaders ( {
250258 type : 'GET' ,
251- url : 'https://registry-1.docker.io/v2/docker/dockerfile/manifests/1.4' ,
259+ url : DOCKERHUB_REGISTRY_URL ,
252260 headers : {
253- 'user-agent' : 'devcontainer' ,
261+ 'user-agent' : DEVCONTAINER_USER_AGENT ,
254262 'authorization' : `Bearer ${ token } ` ,
255- 'accept' : 'application/vnd.docker.distribution.manifest.v2+json'
263+ 'accept' : DOCKER_MANIFEST_ACCEPT_HEADER
256264 }
257265 } , output ) ;
258266 if ( ! manifestRes || manifestRes . statusCode !== 200 ) {
@@ -264,10 +272,10 @@ async function ensureDockerfileFrontendAccessible(params: DockerResolverParamete
264272 const { output } = params . common ;
265273 try {
266274 await retry (
267- async ( ) => { await checkDockerfileFrontendAccessibleOrThrow ( params ) ; } ,
268- { maxRetries : 5 , retryIntervalMilliseconds : 2000 , output }
275+ async ( ) => { await checkDockerfileFrontendAccessible ( params ) ; } ,
276+ { maxRetries : DOCKERFILE_FRONTEND_CHECK_MAX_RETRIES , retryIntervalMilliseconds : DOCKERFILE_FRONTEND_CHECK_RETRY_INTERVAL_MS , output }
269277 ) ;
270- output . write ( 'Dockerfile frontend is accessible in DockerHub registry.' , LogLevel . Info ) ;
278+ output . write ( 'Dockerfile frontend is accessible in DockerHub registry.' , LogLevel . Info ) ;
271279 return true ;
272280 } catch ( err ) {
273281 output . write (
0 commit comments