Skip to content
This repository has been archived by the owner on Oct 20, 2023. It is now read-only.

Commit

Permalink
Add support for other response content-types
Browse files Browse the repository at this point in the history
The new option `mimeType` lets you respond with any file type you want.
  • Loading branch information
mischah committed Dec 2, 2017
1 parent a22d97f commit 08f54af
Show file tree
Hide file tree
Showing 8 changed files with 158 additions and 7 deletions.
1 change: 1 addition & 0 deletions response-files/example.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<a href="https://github.com">GitHub</a>
1 change: 1 addition & 0 deletions response-files/example.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This is just a plain old text file.
26 changes: 26 additions & 0 deletions server/api/fileTypes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
'use strict';

const SetupEndpoint = require('./setup/');

module.exports = SetupEndpoint({
name: 'fileTypes',
urls: [{
params: '/json',
requests: [{
response: '/response-files/simpleExample.json'
}]
}, {
params: '/text',
requests: [{
response: '/response-files/example.txt',
mimeType: 'text/plain'
}]
}, {
params: '/html',
requests: [{
response: '/response-files/example.html',
statusCode: 201,
mimeType: 'text/html'
}]
}]
});
15 changes: 12 additions & 3 deletions server/api/setup/supportedMethod.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
'use strict';

const Boom = require('boom');
const Fs = require('fs');
const Path = require('path');

module.exports = function (server, proposedRequest, settings, params, path) {

const method = proposedRequest.method || 'GET';
const mimeType = proposedRequest.mimeType || 'application/json';

return {
method,
Expand All @@ -23,7 +26,8 @@ module.exports = function (server, proposedRequest, settings, params, path) {
server.log('info', 'Received payload:' + JSON.stringify(request.payload));

if (typeof proposedRequest.response === 'string') {
response = require('../../..' + proposedRequest.response);
const filePath = Path.normalize(Path.join(__dirname, '../../../', proposedRequest.response));
response = Fs.readFileSync(filePath, 'utf8');
}
else {
response = proposedRequest.response;
Expand All @@ -32,9 +36,14 @@ module.exports = function (server, proposedRequest, settings, params, path) {
}

if (proposedRequest.statusCode && proposedRequest.response) {
return reply(response).code(proposedRequest.statusCode);
return reply(response).code(proposedRequest.statusCode).type(mimeType);
}
return reply(response);

if (response.isBoom === true) {
return reply(response);
}

return reply(response).type(mimeType);
}
};
};
8 changes: 4 additions & 4 deletions test/server/api/endpoint.js
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ lab.experiment('Setup endpoints', () => {
server.inject(request, (response) => {

Code.expect(response.statusCode).to.equal(200);
Code.expect(response.result).to.equal({ response: 'Yeah' });
Code.expect(JSON.parse(response.result)).to.equal({ response: 'Yeah' });

done();
});
Expand Down Expand Up @@ -168,7 +168,7 @@ lab.experiment('Setup endpoints', () => {
server.inject(request, (response) => {

Code.expect(response.statusCode).to.equal(200);
Code.expect(response.result).to.equal({ response: 'Yeah' });
Code.expect(JSON.parse(response.result)).to.equal({ response: 'Yeah' });

done();
});
Expand All @@ -184,7 +184,7 @@ lab.experiment('Setup endpoints', () => {
server.inject(request, (response) => {

Code.expect(response.statusCode).to.equal(200);
Code.expect(response.result).to.equal({ response: 'Yeah' });
Code.expect(JSON.parse(response.result)).to.equal({ response: 'Yeah' });

done();
});
Expand Down Expand Up @@ -216,7 +216,7 @@ lab.experiment('Setup endpoints', () => {
server.inject(request, (response) => {

Code.expect(response.statusCode).to.equal(200);
Code.expect(response.result).to.equal({ response: 'Yeah' });
Code.expect(JSON.parse(response.result)).to.equal({ response: 'Yeah' });

done();
});
Expand Down
112 changes: 112 additions & 0 deletions test/server/api/fileTypes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
'use strict';

const Lab = require('lab');
const Code = require('code');
const Config = require('../../../config');
const Hapi = require('hapi');
const SetupEndpoint = require('../../../server/api/setup/');

const apiUrlPrefix = Config.get('/apiUrlPrefix');

const Endpoint = SetupEndpoint({
name: 'fileTypes',
urls: [{
params: '/json',
requests: [{
response: '/test/server/api/fixtures/response.json'
}]
}, {
params: '/text',
requests: [{
response: '/test/server/api/fixtures/response.txt',
mimeType: 'text/plain'
}]
}, {
params: '/html',
requests: [{
response: '/test/server/api/fixtures/response.html',
statusCode: 201,
mimeType: 'text/html'
}]
}]
});

const lab = exports.lab = Lab.script();
let request;
let server;

lab.beforeEach((done) => {

const plugins = [Endpoint];
server = new Hapi.Server();
server.connection({ port: Config.get('/port/web') });
server.register(plugins, (err) => {

if (err) {
return done(err);
}

done();
});
});


lab.experiment('Different file types', () => {

lab.beforeEach((done) => {


done();
});


lab.test('content-type header defaults to `application/json`', (done) => {

request = {
method: 'GET',
url: apiUrlPrefix + '/fileTypes/json'
};

server.inject(request, (response) => {

Code.expect(response.headers['content-type']).to.equal('application/json; charset=utf-8');

done();
});
});

lab.test('return text files with the defined content-type header`', (done) => {

request = {
method: 'GET',
url: apiUrlPrefix + '/fileTypes/text'
};

server.inject(request, (response) => {

Code.expect(response.headers['content-type']).to.equal('text/plain; charset=utf-8');
Code.expect(response.result).to.equal('This is just a plain old text file.\n');

done();
});
});

lab.test('return with the defined content-type header and custom status code`', (done) => {

request = {
method: 'GET',
url: apiUrlPrefix + '/fileTypes/html'
};

server.inject(request, (response) => {

Code.expect(response.headers['content-type']).to.equal('text/html; charset=utf-8');
Code.expect(response.result).to.equal('<a href="https://github.com">GitHub</a>\n');
Code.expect(response.statusCode).to.equal(201);

done();
});
});


});
1 change: 1 addition & 0 deletions test/server/api/fixtures/response.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<a href="https://github.com">GitHub</a>
1 change: 1 addition & 0 deletions test/server/api/fixtures/response.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This is just a plain old text file.

0 comments on commit 08f54af

Please sign in to comment.