Include query parameters when proxying

This commit is contained in:
Asher 2020-03-31 13:11:35 -05:00
parent 561b6343c8
commit fd339a7433
No known key found for this signature in database
GPG Key ID: D63C1EF81242354A
2 changed files with 14 additions and 5 deletions

View File

@ -66,10 +66,12 @@ You can use [Let's Encrypt](https://letsencrypt.org/) to get an SSL certificate
for free. for free.
## How do I access web services? ## How do I access web services?
code-server is capable of proxying to any port using either a subdomain or a code-server is capable of proxying to any port using either a subdomain or a
subpath. subpath.
### Sub-domains ### Sub-domains
Set up a wildcard certificate for your domain and a wildcard DNS entry (or you Set up a wildcard certificate for your domain and a wildcard DNS entry (or you
can configure each subdomain individually for the ports you expect to use). can configure each subdomain individually for the ports you expect to use).
@ -83,6 +85,7 @@ Now you can browse to `<port>.coder.com`. Note that this uses the host header so
ensure your reverse proxy forwards that information if you are using one. ensure your reverse proxy forwards that information if you are using one.
### Sub-paths ### Sub-paths
Just browse to `/proxy/<port>/`. Just browse to `/proxy/<port>/`.
## x86 releases? ## x86 releases?

View File

@ -2,6 +2,7 @@ import { logger } from "@coder/logger"
import * as http from "http" import * as http from "http"
import proxy from "http-proxy" import proxy from "http-proxy"
import * as net from "net" import * as net from "net"
import * as querystring from "querystring"
import { HttpCode, HttpError } from "../../common/http" import { HttpCode, HttpError } from "../../common/http"
import { HttpProvider, HttpProviderOptions, HttpProxyProvider, HttpResponse, Route } from "../http" import { HttpProvider, HttpProviderOptions, HttpProxyProvider, HttpResponse, Route } from "../http"
@ -47,7 +48,7 @@ export class ProxyHttpProvider extends HttpProvider implements HttpProxyProvider
} }
} }
const payload = this.doProxy(route.requestPath, request, response, base) const payload = this.doProxy(route.requestPath, route.query, request, response, base)
if (payload) { if (payload) {
return payload return payload
} }
@ -62,7 +63,7 @@ export class ProxyHttpProvider extends HttpProvider implements HttpProxyProvider
head: Buffer, head: Buffer,
): Promise<void> { ): Promise<void> {
this.ensureAuthenticated(request) this.ensureAuthenticated(request)
this.doProxy(route.requestPath, request, socket, head, route.base.replace(/^\//, "")) this.doProxy(route.requestPath, route.query, request, socket, head, route.base.replace(/^\//, ""))
} }
public getCookieDomain(host: string): string { public getCookieDomain(host: string): string {
@ -83,7 +84,7 @@ export class ProxyHttpProvider extends HttpProvider implements HttpProxyProvider
response: http.ServerResponse, response: http.ServerResponse,
): HttpResponse | undefined { ): HttpResponse | undefined {
const port = this.getPort(request) const port = this.getPort(request)
return port ? this.doProxy(route.fullPath, request, response, port) : undefined return port ? this.doProxy(route.fullPath, route.query, request, response, port) : undefined
} }
public maybeProxyWebSocket( public maybeProxyWebSocket(
@ -93,7 +94,7 @@ export class ProxyHttpProvider extends HttpProvider implements HttpProxyProvider
head: Buffer, head: Buffer,
): HttpResponse | undefined { ): HttpResponse | undefined {
const port = this.getPort(request) const port = this.getPort(request)
return port ? this.doProxy(route.fullPath, request, socket, head, port) : undefined return port ? this.doProxy(route.fullPath, route.query, request, socket, head, port) : undefined
} }
private getPort(request: http.IncomingMessage): string | undefined { private getPort(request: http.IncomingMessage): string | undefined {
@ -121,12 +122,14 @@ export class ProxyHttpProvider extends HttpProvider implements HttpProxyProvider
private doProxy( private doProxy(
path: string, path: string,
query: querystring.ParsedUrlQuery,
request: http.IncomingMessage, request: http.IncomingMessage,
response: http.ServerResponse, response: http.ServerResponse,
portStr: string, portStr: string,
): HttpResponse ): HttpResponse
private doProxy( private doProxy(
path: string, path: string,
query: querystring.ParsedUrlQuery,
request: http.IncomingMessage, request: http.IncomingMessage,
socket: net.Socket, socket: net.Socket,
head: Buffer, head: Buffer,
@ -134,6 +137,7 @@ export class ProxyHttpProvider extends HttpProvider implements HttpProxyProvider
): HttpResponse ): HttpResponse
private doProxy( private doProxy(
path: string, path: string,
query: querystring.ParsedUrlQuery,
request: http.IncomingMessage, request: http.IncomingMessage,
responseOrSocket: http.ServerResponse | net.Socket, responseOrSocket: http.ServerResponse | net.Socket,
headOrPortStr: Buffer | string, headOrPortStr: Buffer | string,
@ -159,7 +163,9 @@ export class ProxyHttpProvider extends HttpProvider implements HttpProxyProvider
autoRewrite: true, autoRewrite: true,
changeOrigin: true, changeOrigin: true,
ignorePath: true, ignorePath: true,
target: `http://127.0.0.1:${port}${path}`, target: `http://127.0.0.1:${port}${path}${
Object.keys(query).length > 0 ? `?${querystring.stringify(query)}` : ""
}`,
} }
if (responseOrSocket instanceof net.Socket) { if (responseOrSocket instanceof net.Socket) {