Challenge #6: Response Data
In this challenge, you’ll complete the full exchange by reading the response data.
Instructions
1. Set the response’s data:
- Set the server’s response status code to
999
. - Set the following response header:
myResponseHeader: "myResponseValue"
- Send the following body:
"my response body"
.
2. After the client receives the entire response, log the response’s data:
- Log
"CLIENT RECEIVED STATUS:"
with the response’s status code. It should be999
. - Log
"CLIENT RECEIVED HEADERS:"
with the response’s headers. All the header names will be lower-case, and some headers will be added automatically by Node.js. They should be:{ myresponseheader: 'myResponseValue', date: '(current date)', connection: 'close', 'content-length': '16', }
- Log
"CLIENT RECEIVED BODY:"
with the response’s body. It should be"my response body"
.
3. Check your test output. You should see:
SERVER LISTENING
SERVER STARTED
CLIENT SENDING REQUEST
SERVER RECEIVING REQUEST
SERVER RECEIVED ENTIRE REQUEST
SERVER RECEIVED METHOD: POST
SERVER RECEIVED PATH: /my/path
SERVER RECEIVED HEADERS: {
myrequestheader: 'myRequestValue',
host: 'localhost:5001',
connection: 'close',
'content-length': '15'
}
SERVER RECEIVED BODY: my request body
SERVER SENT RESPONSE
CLIENT RECEIVING RESPONSE
CLIENT RECEIVED ENTIRE RESPONSE
CLIENT RECEIVED STATUS: 999
CLIENT RECEIVED HEADERS: {
myresponseheader: 'myResponseValue',
date: '(current date)',
connection: 'close',
'content-length': '16'
}
CLIENT RECEIVED BODY: my response body
EXCHANGE COMPLETE
SERVER CLOSED
SERVER STOPPED
Remember to commit your changes when you’re done.
API Documentation
serverResponse.statusCode = status;
Set the response’s status code.
- status
(number)
- the status code
serverResponse.setHeader(name, value)
Set a response header.
- name
(string)
- the header’s name - value
(string)
- the header’s value
serverResponse.end(body);
Complete the HTTP response by sending the response body (if any). This function returns immediately, before all the data has been sent.
- optional body
(string)
- the response body
const status = clientResponse.statusCode;
The response’s status code.
- returns status
(number)
- the status code
const headers = clientResponse.headers;
The response’s headers. Header names and values are mapped to object names and values.
- returns headers
(object)
- the headers
clientResponse.on("data", fn);
Important: This is a replacement for clientResponse.resume()
.
Run fn
when the client receives body data from the server. Note that the server can send multiple pieces of data, so fn
can be called multiple times. Accumulate it into a string like this:
let data = "";
clientResponse.on("data", (chunk) => {
data += chunk;
}
- fn
((chunk) => void)
- the function to run - chunk
(Buffer)
- the data
JavaScript Primers
No new concepts.
Hints
1
The server needs to set the status code, headers, and body.
You can use serverResponse.statusCode
, serverResponse.setHeader()
, and serverResponse.end()
to do that.
it("performs request", async () => {
const server = http.createServer();
await new Promise((resolve, reject) => { // add <void> for TypeScript
server.listen(PORT);
server.on("listening", () => {
console.log("SERVER LISTENING");
return resolve();
});
});
console.log("SERVER STARTED");
server.on("request", (serverRequest, serverResponse) => {
console.log("SERVER RECEIVING REQUEST");
let body = "";
serverRequest.on("data", (chunk) => {
body += chunk;
});
serverRequest.on("end", () => {
console.log("SERVER RECEIVED ENTIRE REQUEST");
console.log("SERVER RECEIVED METHOD:", serverRequest.method);
console.log("SERVER RECEIVED PATH:", serverRequest.url);
console.log("SERVER RECEIVED HEADERS:", serverRequest.headers);
console.log("SERVER RECEIVED BODY:", body);
serverResponse.statusCode = 999;
serverResponse.setHeader("myResponseHeader", "myResponseValue");
serverResponse.end("my response body");
console.log("SERVER SENT RESPONSE");
});
});
console.log("CLIENT SENDING REQUEST");
const clientRequest = http.request({
host: HOST,
port: PORT,
method: "POST",
path: "/my/path",
headers: {
myRequestHeader: "myRequestValue",
},
});
clientRequest.end("my request body");
await new Promise((resolve, reject) => { // add <void> for TypeScript
clientRequest.on("response", (clientResponse) => {
console.log("CLIENT RECEIVING RESPONSE");
clientResponse.resume();
clientResponse.on("end", () => {
console.log("CLIENT RECEIVED ENTIRE RESPONSE");
resolve();
});
});
});
console.log("EXCHANGE COMPLETE");
await new Promise((resolve, reject) => { // add <void> for TypeScript
server.close();
server.on("close", () => {
console.log("SERVER CLOSED");
return resolve();
});
});
console.log("SERVER STOPPED");
});
2
The client needs to log the response metadata (status code and headers)
You can use clientResponse.statusCode
and clientResponse.headers
to do that.
They should go in the clientResponse.on("end", ...)
event handler.
it("performs request", async () => {
const server = http.createServer();
await new Promise((resolve, reject) => { // add <void> for TypeScript
server.listen(PORT);
server.on("listening", () => {
console.log("SERVER LISTENING");
return resolve();
});
});
console.log("SERVER STARTED");
server.on("request", (serverRequest, serverResponse) => {
console.log("SERVER RECEIVING REQUEST");
let body = "";
serverRequest.on("data", (chunk) => {
body += chunk;
});
serverRequest.on("end", () => {
console.log("SERVER RECEIVED ENTIRE REQUEST");
console.log("SERVER RECEIVED METHOD:", serverRequest.method);
console.log("SERVER RECEIVED PATH:", serverRequest.url);
console.log("SERVER RECEIVED HEADERS:", serverRequest.headers);
console.log("SERVER RECEIVED BODY:", body);
serverResponse.statusCode = 999;
serverResponse.setHeader("myResponseHeader", "myResponseValue");
serverResponse.end("my response body");
console.log("SERVER SENT RESPONSE");
});
});
console.log("CLIENT SENDING REQUEST");
const clientRequest = http.request({
host: HOST,
port: PORT,
method: "POST",
path: "/my/path",
headers: {
myRequestHeader: "myRequestValue",
},
});
clientRequest.end("my request body");
await new Promise((resolve, reject) => { // add <void> for TypeScript
clientRequest.on("response", (clientResponse) => {
console.log("CLIENT RECEIVING RESPONSE");
clientResponse.resume();
clientResponse.on("end", () => {
console.log("CLIENT RECEIVED ENTIRE RESPONSE");
console.log("CLIENT RECEIVED STATUS:", clientResponse.statusCode);
console.log("CLIENT RECEIVED HEADERS:", clientResponse.headers);
resolve();
});
});
});
console.log("EXCHANGE COMPLETE");
await new Promise((resolve, reject) => { // add <void> for TypeScript
server.close();
server.on("close", () => {
console.log("SERVER CLOSED");
return resolve();
});
});
console.log("SERVER STOPPED");
});
3
The client needs to log the response body.
You can use clientResponse.on("data", ...)
to do that.
It takes the place of clientResponse.resume()
.
it("performs request", async () => {
const server = http.createServer();
await new Promise((resolve, reject) => { // add <void> for TypeScript
server.listen(PORT);
server.on("listening", () => {
console.log("SERVER LISTENING");
return resolve();
});
});
console.log("SERVER STARTED");
server.on("request", (serverRequest, serverResponse) => {
console.log("SERVER RECEIVING REQUEST");
let body = "";
serverRequest.on("data", (chunk) => {
body += chunk;
});
serverRequest.on("end", () => {
console.log("SERVER RECEIVED ENTIRE REQUEST");
console.log("SERVER RECEIVED METHOD:", serverRequest.method);
console.log("SERVER RECEIVED PATH:", serverRequest.url);
console.log("SERVER RECEIVED HEADERS:", serverRequest.headers);
console.log("SERVER RECEIVED BODY:", body);
serverResponse.statusCode = 999;
serverResponse.setHeader("myResponseHeader", "myResponseValue");
serverResponse.end("my response body");
console.log("SERVER SENT RESPONSE");
});
});
console.log("CLIENT SENDING REQUEST");
const clientRequest = http.request({
host: HOST,
port: PORT,
method: "POST",
path: "/my/path",
headers: {
myRequestHeader: "myRequestValue",
},
});
clientRequest.end("my request body");
await new Promise((resolve, reject) => { // add <void> for TypeScript
clientRequest.on("response", (clientResponse) => {
console.log("CLIENT RECEIVING RESPONSE");
let body = "";
clientResponse.on("data", (chunk) => {
body += chunk;
});
clientResponse.on("end", () => {
console.log("CLIENT RECEIVED ENTIRE RESPONSE");
console.log("CLIENT RECEIVED STATUS:", clientResponse.statusCode);
console.log("CLIENT RECEIVED HEADERS:", clientResponse.headers);
console.log("CLIENT RECEIVED BODY:", body);
resolve();
});
});
});
console.log("EXCHANGE COMPLETE");
await new Promise((resolve, reject) => { // add <void> for TypeScript
server.close();
server.on("close", () => {
console.log("SERVER CLOSED");
return resolve();
});
});
console.log("SERVER STOPPED");
});
Complete Solution
Test code (JavaScript):
it("performs request", async () => {
const server = http.createServer();
await new Promise((resolve, reject) => {
server.listen(PORT);
server.on("listening", () => {
console.log("SERVER LISTENING");
return resolve();
});
});
console.log("SERVER STARTED");
server.on("request", (serverRequest, serverResponse) => {
console.log("SERVER RECEIVING REQUEST");
let body = "";
serverRequest.on("data", (chunk) => {
body += chunk;
});
serverRequest.on("end", () => {
console.log("SERVER RECEIVED ENTIRE REQUEST");
console.log("SERVER RECEIVED METHOD:", serverRequest.method);
console.log("SERVER RECEIVED PATH:", serverRequest.url);
console.log("SERVER RECEIVED HEADERS:", serverRequest.headers);
console.log("SERVER RECEIVED BODY:", body);
serverResponse.statusCode = 999;
serverResponse.setHeader("myResponseHeader", "myResponseValue");
serverResponse.end("my response body");
console.log("SERVER SENT RESPONSE");
});
});
console.log("CLIENT SENDING REQUEST");
const clientRequest = http.request({
host: HOST,
port: PORT,
method: "POST",
path: "/my/path",
headers: {
myRequestHeader: "myRequestValue",
},
});
clientRequest.end("my request body");
await new Promise((resolve, reject) => {
clientRequest.on("response", (clientResponse) => {
console.log("CLIENT RECEIVING RESPONSE");
let body = "";
clientResponse.on("data", (chunk) => {
body += chunk;
});
clientResponse.on("end", () => {
console.log("CLIENT RECEIVED ENTIRE RESPONSE");
console.log("CLIENT RECEIVED STATUS:", clientResponse.statusCode);
console.log("CLIENT RECEIVED HEADERS:", clientResponse.headers);
console.log("CLIENT RECEIVED BODY:", body);
resolve();
});
});
});
console.log("EXCHANGE COMPLETE");
await new Promise((resolve, reject) => {
server.close();
server.on("close", () => {
console.log("SERVER CLOSED");
return resolve();
});
});
console.log("SERVER STOPPED");
});
Test code (TypeScript):
it("performs request", async () => {
const server = http.createServer();
await new Promise<void>((resolve, reject) => {
server.listen(PORT);
server.on("listening", () => {
console.log("SERVER LISTENING");
return resolve();
});
});
console.log("SERVER STARTED");
server.on("request", (serverRequest, serverResponse) => {
console.log("SERVER RECEIVING REQUEST");
let body = "";
serverRequest.on("data", (chunk) => {
body += chunk;
});
serverRequest.on("end", () => {
console.log("SERVER RECEIVED ENTIRE REQUEST");
console.log("SERVER RECEIVED METHOD:", serverRequest.method);
console.log("SERVER RECEIVED PATH:", serverRequest.url);
console.log("SERVER RECEIVED HEADERS:", serverRequest.headers);
console.log("SERVER RECEIVED BODY:", body);
serverResponse.statusCode = 999;
serverResponse.setHeader("myResponseHeader", "myResponseValue");
serverResponse.end("my response body");
console.log("SERVER SENT RESPONSE");
});
});
console.log("CLIENT SENDING REQUEST");
const clientRequest = http.request({
host: HOST,
port: PORT,
method: "POST",
path: "/my/path",
headers: {
myRequestHeader: "myRequestValue",
},
});
clientRequest.end("my request body");
await new Promise<void>((resolve, reject) => {
clientRequest.on("response", (clientResponse) => {
console.log("CLIENT RECEIVING RESPONSE");
let body = "";
clientResponse.on("data", (chunk) => {
body += chunk;
});
clientResponse.on("end", () => {
console.log("CLIENT RECEIVED ENTIRE RESPONSE");
console.log("CLIENT RECEIVED STATUS:", clientResponse.statusCode);
console.log("CLIENT RECEIVED HEADERS:", clientResponse.headers);
console.log("CLIENT RECEIVED BODY:", body);
resolve();
});
});
});
console.log("EXCHANGE COMPLETE");
await new Promise<void>((resolve, reject) => {
server.close();
server.on("close", () => {
console.log("SERVER CLOSED");
return resolve();
});
});
console.log("SERVER STOPPED");
});
No production code yet.