@@ -289,7 +289,7 @@ export abstract class HttpProvider {
289289 /**
290290 * Helper to error if not authorized.
291291 */
292- protected ensureAuthenticated ( request : http . IncomingMessage ) : void {
292+ public ensureAuthenticated ( request : http . IncomingMessage ) : void {
293293 if ( ! this . authenticated ( request ) ) {
294294 throw new HttpError ( "Unauthorized" , HttpCode . Unauthorized )
295295 }
@@ -647,10 +647,7 @@ export class HttpServer {
647647 }
648648
649649 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 ) )
654651 if ( payload . proxy ) {
655652 this . doProxy ( route , request , response , payload . proxy )
656653 } else {
@@ -685,15 +682,23 @@ export class HttpServer {
685682 }
686683
687684 /**
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.
689687 */
690- private maybeRedirect ( request : http . IncomingMessage , route : ProviderRoute ) : RedirectResponse | undefined {
688+ private async handleRequest ( route : ProviderRoute , request : http . IncomingMessage ) : Promise < HttpResponse | undefined > {
691689 // If we're handling TLS ensure all requests are redirected to HTTPS.
692690 if ( this . options . cert && ! ( request . connection as tls . TLSSocket ) . encrypted ) {
693691 return { redirect : route . fullPath }
694692 }
695693
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 )
697702 }
698703
699704 /**
@@ -744,7 +749,7 @@ export class HttpServer {
744749 // can't be transferred so we need an in-between).
745750 const socketProxy = await this . socketProvider . createProxy ( socket )
746751 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 ) )
748753 if ( payload && payload . proxy ) {
749754 this . doProxy ( route , request , { socket : socketProxy , head } , payload . proxy )
750755 }
@@ -894,8 +899,10 @@ export class HttpServer {
894899 *
895900 * For example if `coder.com` is specified `8080.coder.com` will be proxied
896901 * 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.
897904 */
898- public maybeProxy ( request : http . IncomingMessage ) : HttpResponse | undefined {
905+ public maybeProxy ( route : ProviderRoute , request : http . IncomingMessage ) : HttpResponse | undefined {
899906 // Split into parts.
900907 const host = request . headers . host || ""
901908 const idx = host . indexOf ( ":" )
@@ -909,6 +916,9 @@ export class HttpServer {
909916 return undefined
910917 }
911918
919+ // Must be authenticated to use the proxy.
920+ route . provider . ensureAuthenticated ( request )
921+
912922 return {
913923 proxy : {
914924 port,
0 commit comments