@@ -289,7 +289,7 @@ export abstract class HttpProvider {
289
289
/**
290
290
* Helper to error if not authorized.
291
291
*/
292
- protected ensureAuthenticated ( request : http . IncomingMessage ) : void {
292
+ public ensureAuthenticated ( request : http . IncomingMessage ) : void {
293
293
if ( ! this . authenticated ( request ) ) {
294
294
throw new HttpError ( "Unauthorized" , HttpCode . Unauthorized )
295
295
}
@@ -647,10 +647,7 @@ export class HttpServer {
647
647
}
648
648
649
649
try {
650
- const payload =
651
- this . maybeRedirect ( request , route ) ||
652
- ( route . provider . authenticated ( request ) && this . maybeProxy ( request ) ) ||
653
- ( await route . provider . handleRequest ( route , request ) )
650
+ const payload = ( await this . handleRequest ( route , request ) ) || ( await route . provider . handleRequest ( route , request ) )
654
651
if ( payload . proxy ) {
655
652
this . doProxy ( route , request , response , payload . proxy )
656
653
} else {
@@ -685,15 +682,23 @@ export class HttpServer {
685
682
}
686
683
687
684
/**
688
- * Return any necessary redirection before delegating to a provider.
685
+ * Handle requests that are always in effect no matter what provider is
686
+ * registered at the route.
689
687
*/
690
- private maybeRedirect ( request : http . IncomingMessage , route : ProviderRoute ) : RedirectResponse | undefined {
688
+ private async handleRequest ( route : ProviderRoute , request : http . IncomingMessage ) : Promise < HttpResponse | undefined > {
691
689
// If we're handling TLS ensure all requests are redirected to HTTPS.
692
690
if ( this . options . cert && ! ( request . connection as tls . TLSSocket ) . encrypted ) {
693
691
return { redirect : route . fullPath }
694
692
}
695
693
696
- return undefined
694
+ // Return robots.txt.
695
+ if ( route . fullPath === "/robots.txt" ) {
696
+ const filePath = path . resolve ( __dirname , "../../src/browser/robots.txt" )
697
+ return { content : await fs . readFile ( filePath ) , filePath }
698
+ }
699
+
700
+ // Handle proxy domains.
701
+ return this . maybeProxy ( route , request )
697
702
}
698
703
699
704
/**
@@ -744,7 +749,7 @@ export class HttpServer {
744
749
// can't be transferred so we need an in-between).
745
750
const socketProxy = await this . socketProvider . createProxy ( socket )
746
751
const payload =
747
- this . maybeProxy ( request ) || ( await route . provider . handleWebSocket ( route , request , socketProxy , head ) )
752
+ this . maybeProxy ( route , request ) || ( await route . provider . handleWebSocket ( route , request , socketProxy , head ) )
748
753
if ( payload && payload . proxy ) {
749
754
this . doProxy ( route , request , { socket : socketProxy , head } , payload . proxy )
750
755
}
@@ -894,8 +899,10 @@ export class HttpServer {
894
899
*
895
900
* For example if `coder.com` is specified `8080.coder.com` will be proxied
896
901
* but `8080.test.coder.com` and `test.8080.coder.com` will not.
902
+ *
903
+ * Throw an error if proxying but the user isn't authenticated.
897
904
*/
898
- public maybeProxy ( request : http . IncomingMessage ) : HttpResponse | undefined {
905
+ public maybeProxy ( route : ProviderRoute , request : http . IncomingMessage ) : HttpResponse | undefined {
899
906
// Split into parts.
900
907
const host = request . headers . host || ""
901
908
const idx = host . indexOf ( ":" )
@@ -909,6 +916,9 @@ export class HttpServer {
909
916
return undefined
910
917
}
911
918
919
+ // Must be authenticated to use the proxy.
920
+ route . provider . ensureAuthenticated ( request )
921
+
912
922
return {
913
923
proxy : {
914
924
port,
0 commit comments