Skip to content

Commit

Permalink
Resolves issue #59 (#60)
Browse files Browse the repository at this point in the history
* Add failing test

* Resolve issue 59
  • Loading branch information
jsumners authored and mcollina committed Jun 3, 2019
1 parent 97508b8 commit 99d3d55
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 2 deletions.
6 changes: 4 additions & 2 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,11 @@ module.exports = fp(function from (fastify, opts, next) {
if (this.request.body instanceof Stream) {
body = this.request.body
} else {
body = JSON.stringify(this.request.body)
// Per RFC 7231 §3.1.1.5 if this header is not present we MAY assume application/octet-stream
const contentType = req.headers['content-type'] || 'application/octet-stream'
body = contentType.toLowerCase() === 'application/json' ? JSON.stringify(this.request.body) : this.request.body
headers['content-length'] = Buffer.byteLength(body)
headers['content-type'] = 'application/json'
headers['content-type'] = contentType
}
}

Expand Down
56 changes: 56 additions & 0 deletions test/post-plain-text.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
'use strict'

const t = require('tap')
const Fastify = require('fastify')
const From = require('..')
const http = require('http')
const get = require('simple-get').concat

const instance = Fastify()
instance.register(From)

t.plan(9)
t.tearDown(instance.close.bind(instance))

const target = http.createServer((req, res) => {
t.pass('request proxied')
t.equal(req.method, 'POST')
t.equal(req.headers['content-type'], 'text/plain')
var data = ''
req.setEncoding('utf8')
req.on('data', (d) => {
data += d
})
req.on('end', () => {
const str = data.toString()
t.deepEqual(str, 'this is plain text')
res.statusCode = 200
res.setHeader('content-type', 'text/plain')
res.end(str)
})
})

instance.post('/', (request, reply) => {
reply.from(`http://localhost:${target.address().port}`)
})

t.tearDown(target.close.bind(target))

instance.listen(0, (err) => {
t.error(err)

target.listen(0, (err) => {
t.error(err)

get({
url: `http://localhost:${instance.server.address().port}`,
method: 'POST',
headers: { 'content-type': 'text/plain' },
body: 'this is plain text'
}, (err, res, data) => {
t.error(err)
t.equal(res.headers['content-type'], 'text/plain')
t.deepEqual(data.toString(), 'this is plain text')
})
})
})

0 comments on commit 99d3d55

Please sign in to comment.