From 3e1f78a2ffb9fc9402777de52380777a46d9b293 Mon Sep 17 00:00:00 2001 From: Rikard Qvarforth Date: Fri, 7 Nov 2014 09:05:55 +0100 Subject: [PATCH] Multipart form requests need to use \r\n instead of only \n #74 Changed isMultipart added test --- src/transaction-runner.coffee | 12 +++--- test/unit/transaction-runner-test.coffee | 47 ++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 6 deletions(-) diff --git a/src/transaction-runner.coffee b/src/transaction-runner.coffee index fb1b11a9a..a6b4a9c7e 100644 --- a/src/transaction-runner.coffee +++ b/src/transaction-runner.coffee @@ -192,11 +192,10 @@ class TransactionRunner return callback() transport = if transaction.protocol is 'https:' then https else http - try - - if transaction.request['body'] != '' - @replaceLineFeedInBody transaction, requestOptions + if transaction.request['body'] and @isMultipart requestOptions + @replaceLineFeedInBody transaction, requestOptions + try req = transport.request requestOptions, handleRequest req.write transaction.request['body'] if transaction.request['body'] != '' req.end() @@ -204,12 +203,13 @@ class TransactionRunner configuration.emitter.emit 'test error', error, test if error return callback() + isMultipart: (requestOptions) => + requestOptions['headers']?['Content-Type']?.indexOf("multipart") > -1 + replaceLineFeedInBody: (transaction, requestOptions) => - logger.debug 'Content-Length before: ' + requestOptions['headers']['Content-Length'] transaction.request['body'] = transaction.request['body'].replace(/\n/g, '\r\n') transaction.request['headers']['Content-Length'] = transaction.request['body'].length requestOptions.headers = transaction.request['headers'] - logger.debug 'Content-Length after: ' + requestOptions['headers']['Content-Length'] module.exports = TransactionRunner diff --git a/test/unit/transaction-runner-test.coffee b/test/unit/transaction-runner-test.coffee index c472e1c9d..99e8b17ef 100644 --- a/test/unit/transaction-runner-test.coffee +++ b/test/unit/transaction-runner-test.coffee @@ -307,3 +307,50 @@ describe 'TransactionRunner', ()-> runner.executeTransaction transaction, () -> assert.ok server.isDone() done() + + describe 'executeTransaction(transaction, callback) multipart', () -> + + beforeEach () -> + multiPartTransaction = + name: 'Group Machine > Machine > Post Message> Bogus example name' + id: 'POST /machines/message' + host: 'localhost' + port: '3000' + request: + body: '\n--BOUNDARY \ncontent-disposition: form-data; name="mess12"\n\n{"message":"mess1"}\n--BOUNDARY\n\nContent-Disposition: form-data; name="mess2"\n\n{"message":"mess1"}\n--BOUNDARY--' + headers: + 'Content-Type': 'multipart/form-data; boundary=BOUNDARY' + 'User-Agent': 'Dredd/0.2.1 (Darwin 13.0.0; x64)' + 'Content-Length': 180 + uri: '/machines/message' + method: 'POST' + expected: + headers: + 'content-type': 'text/htm' + body: '' + status: '204' + origin: + resourceGroupName: 'Group Machine' + resourceName: 'Machine' + actionName: 'Post Message' + exampleName: 'Bogus example name' + fullPath: '/machines/message' + protocol: 'http:' + + describe 'when multipart body request', () -> + + parsedBody = '\r\n--BOUNDARY \r\ncontent-disposition: form-data; name="mess12"\r\n\r\n{"message":"mess1"}\r\n--BOUNDARY\r\n\r\nContent-Disposition: form-data; name="mess2"\r\n\r\n{"message":"mess1"}\r\n--BOUNDARY--' + beforeEach () -> + server = nock('http://localhost:3000'). + post('/machines/message'). + reply 204 + configuration.server = 'http://localhost:3000' + + afterEach () -> + nock.cleanAll() + + it 'should replace line feed in body', (done) -> + runner.executeTransaction multiPartTransaction, () -> + assert.ok server.isDone() + assert.equal multiPartTransaction['request']['body'], parsedBody, 'Body' + done()