Skip to content
This repository was archived by the owner on Feb 12, 2024. It is now read-only.

Commit 6b0838b

Browse files
committed
Use ipfs-multipart to parse the payload
1 parent d190153 commit 6b0838b

File tree

5 files changed

+96
-78
lines changed

5 files changed

+96
-78
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
"ipfs-api": "^2.13.1",
7676
"ipfs-blocks": "^0.1.0",
7777
"ipfs-merkle-dag": "^0.2.1",
78+
"ipfs-multipart": "0.0.1",
7879
"ipfs-repo": "^0.5.0",
7980
"joi": "^8.0.2",
8081
"lodash.get": "^4.0.0",

src/http-api/resources/config.js

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const get = require('lodash.get')
66
const set = require('lodash.set')
77
const log = debug('http-api:config')
88
log.error = debug('http-api:config:error')
9+
const multipart = require('ipfs-multipart')
910

1011
exports = module.exports
1112

@@ -130,24 +131,43 @@ exports.show = (request, reply) => {
130131
exports.replace = {
131132
// pre request handler that parses the args and returns `config` which is assigned to `request.pre.args`
132133
parseArgs: (request, reply) => {
133-
if (!request.payload || !request.payload.file) {
134+
if (!request.payload) {
134135
return reply({
135136
Message: "Argument 'file' is required",
136137
Code: 1123
137138

138139
}).code(400).takeover()
139140
}
140141

141-
try {
142-
return reply({
143-
config: JSON.parse(request.payload.file.toString())
142+
const parser = multipart.reqParser(request.payload)
143+
let file
144+
145+
parser.on('file', (fileName, fileStream) => {
146+
fileStream.on('data', (data) => {
147+
file = data
144148
})
145-
} catch (err) {
146-
return reply({
147-
Message: 'Failed to decode file as config: ' + err,
148-
Code: 0
149-
}).code(500).takeover()
150-
}
149+
})
150+
151+
parser.on('end', () => {
152+
if (!file) {
153+
return reply({
154+
Message: "Argument 'file' is required",
155+
Code: 1123
156+
157+
}).code(400).takeover()
158+
}
159+
160+
try {
161+
return reply({
162+
config: JSON.parse(file.toString())
163+
})
164+
} catch (err) {
165+
return reply({
166+
Message: 'Failed to decode file as config: ' + err,
167+
Code: 0
168+
}).code(500).takeover()
169+
}
170+
})
151171
},
152172

153173
// main route handler which is called after the above `parseArgs`, but only if the args were valid

src/http-api/routes/config.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ api.route({
2222
method: '*',
2323
path: '/api/v0/config/replace',
2424
config: {
25+
payload: {
26+
parse: false,
27+
output: 'stream'
28+
},
2529
pre: [
2630
{ method: resources.config.replace.parseArgs, assign: 'args' }
2731
],

tests/otherconfig

Lines changed: 46 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,87 +1,70 @@
11
{
2-
"API": {
3-
"HTTPHeaders": {
4-
"Access-Control-Allow-Origin": [
5-
"http://example.com"
6-
]
7-
}
8-
},
9-
"Addresses": {
10-
"API": "/ip4/127.0.0.1/tcp/5001",
11-
"Gateway": "/ip4/127.0.0.1/tcp/8080",
12-
"Swarm": [
13-
"/ip4/0.0.0.0/tcp/4001",
14-
"/ip6/::/tcp/4001"
15-
]
2+
"Identity": {
3+
"PeerID": "QmQ2zigjQikYnyYUSXZydNXrDRhBut2mubwJBaLXobMt3A",
4+
"PrivKey": "CAASpgkwggSiAgEAAoIBAQC2SKo/HMFZeBml1AF3XijzrxrfQXdJzjePBZAbdxqKR1Mc6juRHXij6HXYPjlAk01BhF1S3Ll4Lwi0cAHhggf457sMg55UWyeGKeUv0ucgvCpBwlR5cQ020i0MgzjPWOLWq1rtvSbNcAi2ZEVn6+Q2EcHo3wUvWRtLeKz+DZSZfw2PEDC+DGPJPl7f8g7zl56YymmmzH9liZLNrzg/qidokUv5u1pdGrcpLuPNeTODk0cqKB+OUbuKj9GShYECCEjaybJDl9276oalL9ghBtSeEv20kugatTvYy590wFlJkkvyl+nPxIH0EEYMKK9XRWlu9XYnoSfboiwcv8M3SlsjAgMBAAECggEAZtju/bcKvKFPz0mkHiaJcpycy9STKphorpCT83srBVQi59CdFU6Mj+aL/xt0kCPMVigJw8P3/YCEJ9J+rS8BsoWE+xWUEsJvtXoT7vzPHaAtM3ci1HZd302Mz1+GgS8Epdx+7F5p80XAFLDUnELzOzKftvWGZmWfSeDnslwVONkL/1VAzwKy7Ce6hk4SxRE7l2NE2OklSHOzCGU1f78ZzVYKSnS5Ag9YrGjOAmTOXDbKNKN/qIorAQ1bovzGoCwx3iGIatQKFOxyVCyO1PsJYT7JO+kZbhBWRRE+L7l+ppPER9bdLFxs1t5CrKc078h+wuUr05S1P1JjXk68pk3+kQKBgQDeK8AR11373Mzib6uzpjGzgNRMzdYNuExWjxyxAzz53NAR7zrPHvXvfIqjDScLJ4NcRO2TddhXAfZoOPVH5k4PJHKLBPKuXZpWlookCAyENY7+Pd55S8r+a+MusrMagYNljb5WbVTgN8cgdpim9lbbIFlpN6SZaVjLQL3J8TWH6wKBgQDSChzItkqWX11CNstJ9zJyUE20I7LrpyBJNgG1gtvz3ZMUQCn3PxxHtQzN9n1P0mSSYs+jBKPuoSyYLt1wwe10/lpgL4rkKWU3/m1Myt0tveJ9WcqHh6tzcAbb/fXpUFT/o4SWDimWkPkuCb+8j//2yiXk0a/T2f36zKMuZvujqQKBgC6B7BAQDG2H2B/ijofp12ejJU36nL98gAZyqOfpLJ+FeMz4TlBDQ+phIMhnHXA5UkdDapQ+zA3SrFk+6yGk9Vw4Hf46B+82SvOrSbmnMa+PYqKYIvUzR4gg34rL/7AhwnbEyD5hXq4dHwMNsIDq+l2elPjwm/U9V0gdAl2+r50HAoGALtsKqMvhv8HucAMBPrLikhXP/8um8mMKFMrzfqZ+otxfHzlhI0L08Bo3jQrb0Z7ByNY6M8epOmbCKADsbWcVre/AAY0ZkuSZK/CaOXNX/AhMKmKJh8qAOPRY02LIJRBCpfS4czEdnfUhYV/TYiFNnKRj57PPYZdTzUsxa/yVTmECgYBr7slQEjb5Onn5mZnGDh+72BxLNdgwBkhO0OCdpdISqk0F0Pxby22DFOKXZEpiyI9XYP1C8wPiJsShGm2yEwBPWXnrrZNWczaVuCbXHrZkWQogBDG3HGXNdU4MAWCyiYlyinIBpPpoAJZSzpGLmWbMWh28+RJS6AQX6KHrK1o2uw=="
165
},
17-
"Bootstrap": [
18-
"/ip4/104.131.131.82/tcp/4001/ipfs/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ",
19-
"/ip4/104.236.176.52/tcp/4001/ipfs/QmSoLnSGccFuZQJzRadHn95W2CrSFmZuTdDWP8HXaHca9z",
20-
"/ip4/104.236.179.241/tcp/4001/ipfs/QmSoLPppuBtQSGwKDZT2M73ULpjvfd3aZ6ha4oFGL1KrGM",
21-
"/ip4/162.243.248.213/tcp/4001/ipfs/QmSoLueR4xBeUbY9WZ9xGUUxunbKWcrNFTDAadQJmocnWm",
22-
"/ip4/128.199.219.111/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu",
23-
"/ip4/104.236.76.40/tcp/4001/ipfs/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64",
24-
"/ip4/178.62.158.247/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd",
25-
"/ip4/178.62.61.185/tcp/4001/ipfs/QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3",
26-
"/ip4/104.236.151.122/tcp/4001/ipfs/QmSoLju6m7xTh3DuokvT3886QRYqxAzb1kShaanJgW36yx"
27-
],
286
"Datastore": {
29-
"GCPeriod": "",
30-
"NoSync": false,
31-
"Params": null,
7+
"Type": "",
328
"Path": "",
33-
"StorageGCWatermark": 0,
349
"StorageMax": "",
35-
"Type": ""
10+
"StorageGCWatermark": 0,
11+
"GCPeriod": "",
12+
"Params": null,
13+
"NoSync": false
14+
},
15+
"Addresses": {
16+
"Swarm": ["/ip4/0.0.0.0/tcp/4001", "/ip6/::/tcp/4001"],
17+
"API": "/ip4/127.0.0.1/tcp/6001",
18+
"Gateway": "/ip4/127.0.0.1/tcp/9090"
19+
},
20+
"Mounts": {
21+
"IPFS": "/ipfs",
22+
"IPNS": "/ipns",
23+
"FuseAllowOther": false
24+
},
25+
"Version": {
26+
"Current": "0.4.0-dev",
27+
"Check": "error",
28+
"CheckDate": "0001-01-01T00:00:00Z",
29+
"CheckPeriod": "172800000000000",
30+
"AutoUpdate": "minor"
3631
},
3732
"Discovery": {
3833
"MDNS": {
3934
"Enabled": true,
4035
"Interval": 10
4136
}
4237
},
43-
"Gateway": {
44-
"HTTPHeaders": null,
45-
"RootRedirect": "",
46-
"Writable": false
47-
},
48-
"Identity": {
49-
"PeerID": "QmWTNDWjxEaLoaQSuotpM1gxvH9xixqFMCGt2ZPDLkL3rK",
50-
"PrivKey": "CAASpwkwggSjAgEAAoIBAQCv0SnHZQhxaXyjX4RnuaHJB1wtlfW02aGMArfDuRIub1mjCgWoeszaaui5H7E8RPQWTfILiOKKd0JnKxdmDO3K0L87KPXqux0GnFGlz8ggxH/wyA7ej7+r//L0Y44H6PoPaP9zTO37zIBEjs/ssL0ZV5dmHiFCk20roGskcdJAgJyrScojLZGjEEK2BuH4+WZkeqJ1tyl1ukWseRKED3ROppY9G4fs+PbfNlybWuAZpe8QAs07zlX06py8I09lP0hcj8MwrXM8BqOPTSaJSldWIhSprziqwYJD6YDKZcCFEWvIO1a3yYS6Y0UuFohwzr8v8Wah67p/xxiVhFFDUd4fAgMBAAECggEAdZSnoS8jX12Rulzl2sydsyjV77KreQBW9qDWrvF1hFJ5mvzX3d4KZEQ9UZktWcYviz8jka1A/CNX6FE8O8aHvSyvx2vUUuBCQCqIvCBike94NNpGf3eZUvlATUrLMOURXv70X/Lh8ZTJb5Am4/8q5+jZWrTpv3GDADsvjFcGqpV77i3RQU9rVU1DkrVoqPGiEwIGOAIHeIgPX9n0ckhzHnMEHaaOdFnXy2YVl/iBEjxE2EAqQ+sUZX7odefew+kzu1gdWSxmeQ5U4dSmpC7UKYV2uUNE7OgoKadQ/EdKjwVTW664M76jUGj0yZcPOa1BKR6MoB3JKBJMvZ4/22QCgQKBgQDmrrKLVzhMb1upjOF8wAWrO/SJ/VSAMX5281v8uwxF7l2Pp0scB4FPx9KUmxeQmh380cp9vfHHH2HfSqXim5Qtn8VXI7mHdG4wNW3BmfktfS46+6juKr7clzXg21bWEZGa+Ed4hqe4xmbSH9ErsK9cQZzM7i4isKiZ6UcoXA/fwQKBgQDDHPTjvhID8AYP0YJ0vVh6+Bc0gxuZJfUNNxf6ekolQNTRbeZECGrguk9ohpFNt91Gda3X86EVkXZ1U7kOcnbWI5LXj+CtaHdZxdyQhTzwuLsHXmbW9eV4t+zPH+pmSyaxe1XWdLTDvZIma5F4Vqgm0f4BRkqwiMrQSDa/4us13wKBgGSqQaHKyveX9MEViGS/CvpBbKI22YQjlRNleXPdUCrILS3+DCnMIKLnCT7uOydQCdwE1L9wfyysxjIBykgMKmqKeTxgi5rPtTH2btH4ViOCqAT3Qy3Dm4x5s/pO3SMHganFxLKU2GYqtj3lwoq1TKEOxNUs7xcWTkzz3qh/HDJBAoGANBdSBk+jjauSYrzDwJkgu0vrHhj20E+C+jFAVJ47l3CUoQlfVcCNkEwNkVGED6TMDdizPhmMYy6/2pksqf/DXG6I8MY37PQcETqzJV59I6OeQ1xfxnpF9pHcRnw133Om8/GCvEvSSwQctec4IlG4eQzNbNewbytGQo9VFqvlsi8CgYEA5UEbCke1KKpzzuDxPWDgscbXQRGsXoWYWKIwiH7PSeEBCmcXm5aU/pkcBO/qudhOkTatgXFRARyq6loWXWFH703kgO+Voc2Cuh5ociWT65xquVyPDzO54PMGcwumefofLevvE+enNWTuuPljYFxeasD9Gyv1l7/ZDamcSM0n+uw="
51-
},
5238
"Ipns": {
53-
"RecordLifetime": "",
5439
"RepublishPeriod": "",
40+
"RecordLifetime": "",
5541
"ResolveCacheSize": 128
5642
},
57-
"Mounts": {
58-
"FuseAllowOther": false,
59-
"IPFS": "/ipfs",
60-
"IPNS": "/ipns"
43+
"Bootstrap": ["/ip4/104.131.131.82/tcp/4001/ipfs/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ", "/ip4/104.236.176.52/tcp/4001/ipfs/QmSoLnSGccFuZQJzRadHn95W2CrSFmZuTdDWP8HXaHca9z", "/ip4/104.236.179.241/tcp/4001/ipfs/QmSoLPppuBtQSGwKDZT2M73ULpjvfd3aZ6ha4oFGL1KrGM", "/ip4/162.243.248.213/tcp/4001/ipfs/QmSoLueR4xBeUbY9WZ9xGUUxunbKWcrNFTDAadQJmocnWm", "/ip4/128.199.219.111/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu", "/ip4/104.236.76.40/tcp/4001/ipfs/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64", "/ip4/178.62.158.247/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd", "/ip4/178.62.61.185/tcp/4001/ipfs/QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3", "/ip4/104.236.151.122/tcp/4001/ipfs/QmSoLju6m7xTh3DuokvT3886QRYqxAzb1kShaanJgW36yx"],
44+
"Tour": {
45+
"Last": ""
46+
},
47+
"Gateway": {
48+
"HTTPHeaders": null,
49+
"RootRedirect": "",
50+
"Writable": false
6151
},
6252
"SupernodeRouting": {
63-
"Servers": [
64-
"/ip4/104.236.176.52/tcp/4002/ipfs/QmXdb7tWTxdFEQEFgWBqkuYSrZd3mXrC7HxkD4krGNYx2U",
65-
"/ip4/104.236.179.241/tcp/4002/ipfs/QmVRqViDByUxjUMoPnjurjKvZhaEMFDtK35FJXHAM4Lkj6",
66-
"/ip4/104.236.151.122/tcp/4002/ipfs/QmSZwGx8Tn8tmcM4PtDJaMeUQNRhNFdBLVGPzRiNaRJtFH",
67-
"/ip4/162.243.248.213/tcp/4002/ipfs/QmbHVEEepCi7rn7VL7Exxpd2Ci9NNB6ifvqwhsrbRMgQFP",
68-
"/ip4/128.199.219.111/tcp/4002/ipfs/Qmb3brdCYmKG1ycwqCbo6LUwWxTuo3FisnJV2yir7oN92R",
69-
"/ip4/104.236.76.40/tcp/4002/ipfs/QmdRBCV8Cz2dGhoKLkD3YjPwVFECmqADQkx5ZteF2c6Fy4",
70-
"/ip4/178.62.158.247/tcp/4002/ipfs/QmUdiMPci7YoEUBkyFZAh2pAbjqcPr7LezyiPD2artLw3v",
71-
"/ip4/178.62.61.185/tcp/4002/ipfs/QmVw6fGNqBixZE4bewRLT2VXX7fAHUHs8JyidDiJ1P7RUN"
72-
]
53+
"Servers": ["/ip4/104.236.176.52/tcp/4002/ipfs/QmXdb7tWTxdFEQEFgWBqkuYSrZd3mXrC7HxkD4krGNYx2U", "/ip4/104.236.179.241/tcp/4002/ipfs/QmVRqViDByUxjUMoPnjurjKvZhaEMFDtK35FJXHAM4Lkj6", "/ip4/104.236.151.122/tcp/4002/ipfs/QmSZwGx8Tn8tmcM4PtDJaMeUQNRhNFdBLVGPzRiNaRJtFH", "/ip4/162.243.248.213/tcp/4002/ipfs/QmbHVEEepCi7rn7VL7Exxpd2Ci9NNB6ifvqwhsrbRMgQFP", "/ip4/128.199.219.111/tcp/4002/ipfs/Qmb3brdCYmKG1ycwqCbo6LUwWxTuo3FisnJV2yir7oN92R", "/ip4/104.236.76.40/tcp/4002/ipfs/QmdRBCV8Cz2dGhoKLkD3YjPwVFECmqADQkx5ZteF2c6Fy4", "/ip4/178.62.158.247/tcp/4002/ipfs/QmUdiMPci7YoEUBkyFZAh2pAbjqcPr7LezyiPD2artLw3v", "/ip4/178.62.61.185/tcp/4002/ipfs/QmVw6fGNqBixZE4bewRLT2VXX7fAHUHs8JyidDiJ1P7RUN"]
54+
},
55+
"API": {
56+
"HTTPHeaders": {
57+
"Access-Control-Allow-Origin": [
58+
"http://example.com"
59+
]
60+
}
7361
},
7462
"Swarm": {
7563
"AddrFilters": null
7664
},
77-
"Tour": {
78-
"Last": ""
79-
},
80-
"Version": {
81-
"AutoUpdate": "minor",
82-
"Check": "error",
83-
"CheckDate": "0001-01-01T00:00:00Z",
84-
"CheckPeriod": "172800000000000",
85-
"Current": "0.4.0-dev"
65+
"Log": {
66+
"MaxSizeMB": 250,
67+
"MaxBackups": 1,
68+
"MaxAgeDays": 0
8669
}
8770
}

tests/test-http-api/test-config.js

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -310,12 +310,22 @@ describe('config', () => {
310310
})
311311

312312
describe('ipfs.config.replace', () => {
313-
it.skip('updates value', (done) => {
314-
const file = 'tests/otherconfig'
315-
ctl.config.replace(file, (err, res) => {
316-
console.log(err, res)
313+
it('returns error if the config is invalid', (done) => {
314+
const filePath = 'tests/badconfig'
315+
316+
ctl.config.replace(filePath, (err) => {
317+
expect(err).to.exist
318+
done()
319+
})
320+
})
321+
322+
it('updates value', (done) => {
323+
const filePath = 'tests/otherconfig'
324+
const expectedConfig = JSON.parse(fs.readFileSync(filePath, 'utf8'))
325+
326+
ctl.config.replace(filePath, (err) => {
317327
expect(err).not.to.exist
318-
expect(res).to.deep.equal(updatedConfig())
328+
expect(expectedConfig).to.deep.equal(updatedConfig())
319329
done()
320330
})
321331
})

0 commit comments

Comments
 (0)