@@ -164,49 +164,33 @@ export class WebClientServer {
164
164
private createRequestUrl ( req : http . IncomingMessage , parsedUrl : url . UrlWithParsedQuery , pathname : string ) : URL {
165
165
const pathPrefix = getPathPrefix ( parsedUrl . pathname ! ) ;
166
166
const remoteAuthority = this . getRemoteAuthority ( req ) ;
167
- // TODO: there isn't a good way for to determine the protocol. Defaulting to `http` for now.
168
167
return new URL ( path . join ( '/' , pathPrefix , pathname ) , remoteAuthority ) ;
169
168
}
170
169
171
170
private _iconSizes = [ 192 , 512 ] ;
172
171
173
- private getRemoteAuthorityHeader = ( req : http . IncomingMessage ) : string => {
174
- let remoteAuthority : string | undefined ;
175
-
172
+ private getRemoteAuthority ( req : http . IncomingMessage ) : URL {
176
173
if ( req . headers . forwarded ) {
177
174
const [ parsedHeader ] = parseForwardHeader ( req . headers . forwarded ) ;
178
-
179
- if ( parsedHeader && parsedHeader . host ) {
180
- return parsedHeader . host ;
181
- }
175
+ return new URL ( `${ parsedHeader . proto } ://${ parsedHeader . host } ` ) ;
182
176
}
183
177
184
- // Listed in order of priority
185
- const headerNames = [
186
- 'X-Forwarded-Host' ,
187
- 'host'
188
- ] ;
189
-
190
- for ( const headerName of headerNames ) {
191
- const header = req . headers [ headerName ] ?. toString ( ) ;
192
- if ( ! isFalsyOrWhitespace ( header ) ) {
193
- return header ! ;
178
+ /* Return first non-empty header. */
179
+ const parseHeaders = ( headerNames : string [ ] ) : string | undefined => {
180
+ for ( const headerName of headerNames ) {
181
+ const header = req . headers [ headerName ] ?. toString ( ) ;
182
+ if ( ! isFalsyOrWhitespace ( header ) ) {
183
+ return header ;
184
+ }
194
185
}
195
- }
196
-
197
- if ( isFalsyOrWhitespace ( remoteAuthority ) ) {
198
- throw new Error ( 'Remote authority not present in host headers' ) ;
199
- }
200
-
201
- return null as never ;
202
- } ;
186
+ return undefined ;
187
+ } ;
203
188
204
- private getRemoteAuthority = ( req : http . IncomingMessage ) : URL => {
205
- const { protocol } = this . _environmentService ;
206
- const remoteAuthority = new URL ( `${ protocol } //${ this . getRemoteAuthorityHeader ( req ) } ` ) ;
189
+ const proto = parseHeaders ( [ "X-Forwarded-Proto" ] ) || "http" ;
190
+ const host = parseHeaders ( [ "X-Forwarded-Host" , "host" ] ) || "localhost" ;
207
191
208
- return remoteAuthority ;
209
- } ;
192
+ return new URL ( ` ${ proto } :// ${ host } ` ) ;
193
+ }
210
194
211
195
/**
212
196
* PWA manifest file. This informs the browser that the app may be installed.
@@ -325,7 +309,7 @@ export class WebClientServer {
325
309
} ,
326
310
folderUri : ( workspacePath && isFolder ) ? transformer . transformOutgoing ( URI . file ( workspacePath ) ) : undefined ,
327
311
workspaceUri : ( workspacePath && ! isFolder ) ? transformer . transformOutgoing ( URI . file ( workspacePath ) ) : undefined ,
328
- // Add port to prevent client-side mismatch for Coder Link
312
+ // Add port to prevent client-side mismatch for reverse proxies.
329
313
remoteAuthority : `${ remoteAuthority . hostname } :${ remoteAuthority . port || ( remoteAuthority . protocol === 'https:' ? '443' : '80' ) } ` ,
330
314
_wrapWebWorkerExtHostInIframe,
331
315
developmentOptions : { enableSmokeTestDriver : this . _environmentService . driverHandle === 'web' ? true : undefined } ,
@@ -340,7 +324,7 @@ export class WebClientServer {
340
324
'img-src \'self\' https: data: blob:;' ,
341
325
'media-src \'none\';' ,
342
326
// the sha is the same as in src/vs/workbench/services/extensions/worker/httpWebWorkerExtensionHostIframe.html
343
- `script-src 'self' 'unsafe-eval' ${ this . _getScriptCspHashes ( data ) . join ( ' ' ) } 'sha256-cb2sg39EJV8ABaSNFfWu/ou8o1xVXYK7jp90oZ9vpcg=' https://cloud.coder.com ;` ,
327
+ `script-src 'self' 'unsafe-eval' ${ this . _getScriptCspHashes ( data ) . join ( ' ' ) } 'sha256-cb2sg39EJV8ABaSNFfWu/ou8o1xVXYK7jp90oZ9vpcg=';` ,
344
328
'child-src \'self\';' ,
345
329
`frame-src 'self' https://*.vscode-webview.net ${ this . _productService . webEndpointUrl || '' } data:;` ,
346
330
'worker-src \'self\' data:;' ,
@@ -508,7 +492,7 @@ export class WebClientServer {
508
492
. replace ( / { { ERROR_ H E A D E R } } / g, ( ) => `${ applicationName } ` )
509
493
. replace ( / { { ERROR_ C O D E } } / g, ( ) => code . toString ( ) )
510
494
. replace ( / { { ERROR_ M E S S A G E } } / g, ( ) => message )
511
- . replace ( / { { ERROR_ F O O T E R } } / g, ( ) => `${ version } — ${ commit } ` )
495
+ . replace ( / { { ERROR_ F O O T E R } } / g, ( ) => `${ version } - ${ commit } ` )
512
496
. replace ( / { { CLIENT_ B A C K G R O U N D _ C O L O R } } / g, ( ) => clientTheme . backgroundColor )
513
497
. replace ( / { { CLIENT_ F O R E G R O U N D _ C O L O R } } / g, ( ) => clientTheme . foregroundColor ) ;
514
498
0 commit comments