It is simple to know the request URL path, it’s one (this.url in Koa) used by routing, but if you are looking to get the complete URL, it’s a little bit complicated. Luckily, there is a quick way to re-assemble the requested URL in Koa, if proxy is not a concern:
var url = this.request.protocol + '://' + this.request.host + this.request.originalUrl;
Or a shorter version:
var url = this.protocol + '://' + this.host + this.originalUrl;
The port number is included in this.host, for example: localhost:3000.
Assume that you have a server running on the host www.example.com with SSL enabled. If you make a request to the server with the URL: https://www.example.com/path, this URL will be echoed back in the response by the above script.
In the example section of SuperTest (v0.15.0), it mentions something about ephemeral port:
You may pass an http.Server, or a Function to request() - if the server is not already listening for connections then it is bound to an ephemeral port for you so there is no need to keep track of ports. - https://github.com/visionmedia/supertest#example
Let’s dissect this sentence. There are a few key concepts to grasp:
The request function will accept either a function or an http.Server object.
When does the server not listening for connections?
What is an ephemeral port?
Taking a peek at the index.js file in SuperTest source code, it is easy to see that it accepts both function and http.Server object, but prefer latter:
// See `index.js` in [SuperTest] source code.
if ('function' == typeof app) app = http.createServer(app);
Only when initiating an Express app, it returns a function, not an object. And follows up on lib/test.js, when SuperTest detects the created server is yet to bind to any port number, it will invoke app.listen(0), so called ephemeral port. In fact, it is just a random port.
When something is ephemeral, it last for a very short time. When allowing a server to accept connections, we usually do is setting the server to listen on a specific port:
What if setting this to 0 like above or omit this port number?