@@ -7,7 +7,6 @@ import * as crypto from 'crypto';
7
7
import * as fs from 'fs' ;
8
8
import * as http from 'http' ;
9
9
import * as net from 'net' ;
10
- import * as os from 'os' ;
11
10
import * as path from 'path' ;
12
11
import * as url from 'url' ;
13
12
import { RunOnceScheduler } from 'vs/base/common/async' ;
@@ -33,9 +32,7 @@ import { ConfigurationService } from 'vs/platform/configuration/common/configura
33
32
import { ExtensionHostDebugBroadcastChannel } from 'vs/platform/debug/common/extensionHostDebugIpc' ;
34
33
import { IDownloadService } from 'vs/platform/download/common/download' ;
35
34
import { DownloadService } from 'vs/platform/download/common/downloadService' ;
36
- import { NativeParsedArgs } from 'vs/platform/environment/common/argv' ;
37
35
import { IEnvironmentService , INativeEnvironmentService } from 'vs/platform/environment/common/environment' ;
38
- import { OptionDescriptions , OPTIONS , parseArgs } from 'vs/platform/environment/node/argv' ;
39
36
import { NativeEnvironmentService } from 'vs/platform/environment/node/environmentService' ;
40
37
import { ExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionGalleryService' ;
41
38
import { IExtensionGalleryService , IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement' ;
@@ -62,6 +59,7 @@ import { RequestChannel } from 'vs/platform/request/common/requestIpc';
62
59
import { RequestService } from 'vs/platform/request/node/requestService' ;
63
60
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry' ;
64
61
import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils' ;
62
+ import { args } from 'vs/server/node/args' ;
65
63
import { IFileChangeDto } from 'vs/workbench/api/common/extHost.protocol' ;
66
64
import { IExtHostReadyMessage , IExtHostSocketMessage } from 'vs/workbench/services/extensions/common/extensionHostProtocol' ;
67
65
import { Logger } from 'vs/workbench/services/extensions/common/extensionPoints' ;
@@ -73,7 +71,7 @@ import { RemoteExtensionLogFileName } from 'vs/workbench/services/remote/common/
73
71
export type IRawURITransformerFactory = ( remoteAuthority : string ) => IRawURITransformer ;
74
72
export const IRawURITransformerFactory = createDecorator < IRawURITransformerFactory > ( 'rawURITransformerFactory' ) ;
75
73
76
- const APP_ROOT = path . join ( __dirname , '..' , '..' , '..' , '..' ) ;
74
+ export const APP_ROOT = path . join ( __dirname , '..' , '..' , '..' , '..' ) ;
77
75
const uriTransformerPath = path . join ( APP_ROOT , 'out/serverUriTransformer' ) ;
78
76
const rawURITransformerFactory : IRawURITransformerFactory = < any > require . __$__nodeRequire ( uriTransformerPath ) ;
79
77
@@ -226,14 +224,6 @@ async function handleRoot(req: http.IncomingMessage, resp: http.ServerResponse,
226
224
return resp . end ( entryPointContent ) ;
227
225
}
228
226
229
- interface ServerParsedArgs extends NativeParsedArgs {
230
- port ?: string
231
- }
232
- const SERVER_OPTIONS : OptionDescriptions < Required < ServerParsedArgs > > = {
233
- ...OPTIONS ,
234
- port : { type : 'string' }
235
- } ;
236
-
237
227
export interface IStartServerResult {
238
228
installingInitialExtensions ?: Promise < void >
239
229
}
@@ -249,17 +239,16 @@ export interface IServerOptions {
249
239
configureExtensionHostForkOptions ?( opts : cp . ForkOptions , accessor : ServicesAccessor , channelServer : IPCServer < RemoteAgentConnectionContext > ) : void ;
250
240
configureExtensionHostProcess ?( extensionHost : cp . ChildProcess , accessor : ServicesAccessor , channelServer : IPCServer < RemoteAgentConnectionContext > ) : IDisposable ;
251
241
242
+ verifyRequest ?( req : http . IncomingMessage , res : http . ServerResponse | undefined , accessor : ServicesAccessor ) : Promise < boolean > ;
252
243
handleRequest ?( pathname : string | null , req : http . IncomingMessage , res : http . ServerResponse , accessor : ServicesAccessor , channelServer : IPCServer < RemoteAgentConnectionContext > ) : Promise < boolean > ;
253
244
}
254
245
255
246
export async function main ( options : IServerOptions ) : Promise < void > {
256
247
const devMode = ! ! process . env [ 'VSCODE_DEV' ] ;
257
248
const connectionToken = generateUuid ( ) ;
258
249
259
- const parsedArgs = parseArgs ( process . argv , SERVER_OPTIONS ) ;
260
- parsedArgs [ 'user-data-dir' ] = URI . file ( path . join ( os . homedir ( ) , product . dataFolderName ) ) . fsPath ;
261
250
const productService = { _serviceBrand : undefined , ...product } ;
262
- const environmentService = new NativeEnvironmentService ( parsedArgs , productService ) ;
251
+ const environmentService = new NativeEnvironmentService ( args , productService ) ;
263
252
264
253
// see src/vs/code/electron-main/main.ts#142
265
254
const bufferLogService = new BufferLogService ( ) ;
@@ -593,10 +582,12 @@ export async function main(options: IServerOptions): Promise<void> {
593
582
const parsedUrl = url . parse ( req . url , true ) ;
594
583
const pathname = parsedUrl . pathname ;
595
584
585
+ if ( options . verifyRequest && ! await instantiationService . invokeFunction ( accessor => options . verifyRequest ! ( req , res , accessor ) ) ) {
586
+ return ;
587
+ }
596
588
if ( options . handleRequest && await instantiationService . invokeFunction ( accessor => options . handleRequest ! ( pathname , req , res , accessor , channelServer ) ) ) {
597
589
return ;
598
590
}
599
-
600
591
//#region headless
601
592
if ( pathname === '/vscode-remote-resource' ) {
602
593
const filePath = parsedUrl . query [ 'path' ] ;
@@ -643,12 +634,16 @@ export async function main(options: IServerOptions): Promise<void> {
643
634
}
644
635
} ) ;
645
636
server . on ( 'error' , e => logService . error ( e ) ) ;
646
- server . on ( 'upgrade' , ( req : http . IncomingMessage , socket : net . Socket ) => {
637
+ server . on ( 'upgrade' , async ( req : http . IncomingMessage , socket : net . Socket ) => {
647
638
if ( req . headers [ 'upgrade' ] !== 'websocket' || ! req . url ) {
648
639
logService . error ( `failed to upgrade for header "${ req . headers [ 'upgrade' ] } " and url: "${ req . url } ".` ) ;
649
640
socket . end ( 'HTTP/1.1 400 Bad Request' ) ;
650
641
return ;
651
642
}
643
+ if ( options . verifyRequest && ! await instantiationService . invokeFunction ( accessor => options . verifyRequest ! ( req , undefined , accessor ) ) ) {
644
+ socket . end ( 'HTTP/1.1 401 Unauthorized' ) ;
645
+ return ;
646
+ }
652
647
const { query } = url . parse ( req . url , true ) ;
653
648
// /?reconnectionToken=c0e3a8af-6838-44fb-851b-675401030831&reconnection=false&skipWebSocketFrames=false
654
649
const reconnection = 'reconnection' in query && query [ 'reconnection' ] === 'true' ;
@@ -758,7 +753,7 @@ export async function main(options: IServerOptions): Promise<void> {
758
753
logService . info ( `[${ token } ] Management connection is connected.` ) ;
759
754
} else {
760
755
if ( ! client . management ) {
761
- logService . error ( `[${ token } ] Failed to reconnect: management connection is not running.` ) ;
756
+ logService . error ( `[${ token } ] Failed to reconnect: management connection is not running.` ) ;
762
757
protocol . sendControl ( VSBuffer . fromString ( JSON . stringify ( { type : 'error' , reason : 'Management connection is not running.' } as ErrorMessage ) ) ) ;
763
758
safeDisposeProtocolAndSocket ( protocol ) ;
764
759
return ;
@@ -848,17 +843,17 @@ export async function main(options: IServerOptions): Promise<void> {
848
843
socket . end ( ) ;
849
844
extensionHost . kill ( ) ;
850
845
client . extensionHost = undefined ;
851
- logService . info ( `[${ token } ] Extension host is disconnected.` ) ;
846
+ logService . info ( `[${ token } ] Extension host is disconnected.` ) ;
852
847
}
853
848
854
849
extensionHost . on ( 'error' , err => {
855
850
dispose ( ) ;
856
- logService . error ( `[${ token } ] Extension host failed with: ` , err ) ;
851
+ logService . error ( `[${ token } ] Extension host failed with: ` , err ) ;
857
852
} ) ;
858
853
extensionHost . on ( 'exit' , ( code : number , signal : string ) => {
859
854
dispose ( ) ;
860
855
if ( code !== 0 && signal !== 'SIGTERM' ) {
861
- logService . error ( `[${ token } ] Extension host exited with code: ${ code } and signal: ${ signal } .` ) ;
856
+ logService . error ( `[${ token } ] Extension host exited with code: ${ code } and signal: ${ signal } .` ) ;
862
857
}
863
858
} ) ;
864
859
@@ -873,7 +868,7 @@ export async function main(options: IServerOptions): Promise<void> {
873
868
permessageDeflate,
874
869
inflateBytes
875
870
} as IExtHostSocketMessage , socket ) ;
876
- logService . info ( `[${ token } ] Extension host is connected.` ) ;
871
+ logService . info ( `[${ token } ] Extension host is connected.` ) ;
877
872
}
878
873
} ;
879
874
extensionHost . on ( 'message' , readyListener ) ;
@@ -882,13 +877,13 @@ export async function main(options: IServerOptions): Promise<void> {
882
877
toDispose = instantiationService . invokeFunction ( accessor => options . configureExtensionHostProcess ! ( extensionHost , accessor , channelServer ) ) ;
883
878
}
884
879
client . extensionHost = extensionHost ;
885
- logService . info ( `[${ token } ] Extension host is started.` ) ;
880
+ logService . info ( `[${ token } ] Extension host is started.` ) ;
886
881
} catch ( e ) {
887
- logService . error ( `[${ token } ] Failed to start the extension host process: ` , e ) ;
882
+ logService . error ( `[${ token } ] Failed to start the extension host process: ` , e ) ;
888
883
}
889
884
} else {
890
885
if ( ! client . extensionHost ) {
891
- logService . error ( `[${ token } ] Failed to reconnect: extension host is not running.` ) ;
886
+ logService . error ( `[${ token } ] Failed to reconnect: extension host is not running.` ) ;
892
887
protocol . sendControl ( VSBuffer . fromString ( JSON . stringify ( { type : 'error' , reason : 'Extension host is not running.' } as ErrorMessage ) ) ) ;
893
888
safeDisposeProtocolAndSocket ( protocol ) ;
894
889
return ;
@@ -908,7 +903,7 @@ export async function main(options: IServerOptions): Promise<void> {
908
903
permessageDeflate,
909
904
inflateBytes
910
905
} as IExtHostSocketMessage , socket ) ;
911
- logService . info ( `[${ token } ] Extension host is reconnected.` ) ;
906
+ logService . info ( `[${ token } ] Extension host is reconnected.` ) ;
912
907
}
913
908
} else {
914
909
logService . error ( `[${ token } ] Unexpected connection type:` , msg . desiredConnectionType ) ;
@@ -921,8 +916,8 @@ export async function main(options: IServerOptions): Promise<void> {
921
916
} ) ;
922
917
} ) ;
923
918
let port = 3000 ;
924
- if ( parsedArgs . port ) {
925
- port = Number ( parsedArgs . port ) ;
919
+ if ( args . port ) {
920
+ port = Number ( args . port ) ;
926
921
} else if ( typeof options . port === 'number' ) {
927
922
port = options . port ;
928
923
}
0 commit comments