@@ -81,7 +81,7 @@ export function currentFile(document?: vscode.TextDocument): CurrentFile {
8181 const content = document . getText ( ) ;
8282 let name = "" ;
8383 let ext = "" ;
84- const { query } = url . parse ( decodeURIComponent ( uri . toString ( ) ) , true ) ;
84+ const { query } = url . parse ( uri . toString ( true ) , true ) ;
8585 const csp = query . csp === "" || query . csp === "1" ;
8686 if ( csp ) {
8787 name = uri . path ;
@@ -167,7 +167,8 @@ export function connectionTarget(uri?: vscode.Uri): ConnectionTarget {
167167 }
168168 } else if ( schemas . includes ( uri . scheme ) ) {
169169 result . apiTarget = uri ;
170- result . configName = uri . authority ;
170+ const parts = uri . authority . split ( ":" ) ;
171+ result . configName = parts . length === 2 ? parts [ 0 ] : uri . authority ;
171172 }
172173 }
173174
@@ -178,7 +179,8 @@ export function connectionTarget(uri?: vscode.Uri): ConnectionTarget {
178179 ? vscode . workspace . workspaceFolders [ 0 ]
179180 : undefined ;
180181 if ( firstFolder && schemas . includes ( firstFolder . uri . scheme ) ) {
181- result . configName = firstFolder . uri . authority ;
182+ const parts = firstFolder . uri . authority . split ( ":" ) ;
183+ result . configName = parts . length === 2 ? parts [ 0 ] : firstFolder . uri . authority ;
182184 result . apiTarget = firstFolder . uri ;
183185 } else {
184186 result . configName = workspaceState . get < string > ( "workspaceFolder" ) || firstFolder ? firstFolder . name : "" ;
@@ -350,7 +352,9 @@ export async function terminalWithDocker(): Promise<vscode.Terminal> {
350352 * Alter isfs-type uri.path of /.vscode/* files or subdirectories.
351353 * Rewrite `/.vscode/path/to/file` as `/_vscode/XYZ/path/to/file`
352354 * where XYZ comes from the `ns` queryparam of uri.
353- * Also alter query to specify `ns=%SYS&csp=1`
355+ * Also alter query to specify `ns=%SYS&csp=1`
356+ * Also handles the alternative syntax isfs://server:namespace/
357+ * in which there is no ns queryparam
354358 *
355359 * @returns uri, altered if necessary.
356360 * @throws if `ns` queryparam is missing but required.
@@ -361,13 +365,24 @@ export function redirectDotvscodeRoot(uri: vscode.Uri): vscode.Uri {
361365 }
362366 const dotMatch = uri . path . match ( / ^ \/ ( \. [ ^ / ] * ) \/ ( .* ) $ / ) ;
363367 if ( dotMatch && dotMatch [ 1 ] === ".vscode" ) {
368+ let namespace : string ;
364369 const nsMatch = `&${ uri . query } &` . match ( / & n s = ( [ ^ & ] + ) & / ) ;
365- if ( ! nsMatch ) {
366- throw new Error ( "No 'ns' query parameter on uri" ) ;
370+ if ( nsMatch ) {
371+ namespace = nsMatch [ 1 ] ;
372+ const newQueryString = ( ( "&" + uri . query ) . replace ( `ns=${ namespace } ` , "ns=%SYS" ) + "&csp=1" ) . slice ( 1 ) ;
373+ return uri . with ( { path : `/_vscode/${ namespace } /${ dotMatch [ 2 ] } ` , query : newQueryString } ) ;
374+ } else {
375+ const parts = uri . authority . split ( ":" ) ;
376+ if ( parts . length === 2 ) {
377+ namespace = parts [ 1 ] ;
378+ return uri . with ( {
379+ authority : `${ parts [ 0 ] } :%SYS` ,
380+ path : `/_vscode/${ namespace } /${ dotMatch [ 2 ] } ` ,
381+ query : uri . query + "&csp=1" ,
382+ } ) ;
383+ }
367384 }
368- const namespace = nsMatch [ 1 ] ;
369- const newQueryString = ( ( "&" + uri . query ) . replace ( `ns=${ namespace } ` , "ns=%SYS" ) + "&csp=1" ) . slice ( 1 ) ;
370- return uri . with ( { path : `/_vscode/${ namespace } /${ dotMatch [ 2 ] } ` , query : newQueryString } ) ;
385+ throw new Error ( "No namespace determined from uri" ) ;
371386 } else {
372387 return uri ;
373388 }
0 commit comments