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

Commit

Permalink
Merge pull request #227 from ipfs/cat/http
Browse files Browse the repository at this point in the history
WIP http cat
  • Loading branch information
daviddias committed May 21, 2016
2 parents 217574f + 7ad4396 commit 695a536
Show file tree
Hide file tree
Showing 14 changed files with 228 additions and 31 deletions.
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@
"ipfs-merkle-dag": "^0.6.0",
"ipfs-multipart": "^0.1.0",
"ipfs-repo": "^0.8.0",
"ipfs-unixfs-engine": "^0.6.1",
"ipfs-unixfs-engine": "^0.8.0",
"joi": "^8.0.5",
"libp2p-ipfs": "^0.5.0",
"libp2p-ipfs-browser": "^0.4.0",
Expand Down Expand Up @@ -122,4 +122,4 @@
"kumavis <kumavis@users.noreply.github.com>",
"nginnever <ginneversource@gmail.com>"
]
}
}
9 changes: 0 additions & 9 deletions src/cli/commands/cat.js

This file was deleted.

17 changes: 12 additions & 5 deletions src/cli/commands/files/cat.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,22 @@ module.exports = Command.extend({
if (err) {
throw err
}
if (utils.isDaemonOn()) {
ipfs.cat(path, (err, res) => {
if (err) {
throw err
}
console.log(res.toString())
})
return
}
ipfs.files.cat(path, (err, res) => {
if (err) {
throw (err)
}
if (res) {
res.on('file', (data) => {
data.stream.pipe(process.stdout)
})
}
res.on('data', (data) => {
data.stream.pipe(process.stdout)
})
})
})
}
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/files/get.js
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ module.exports = Command.extend({
if (err) {
throw err
}
result.on('file', fileHandler(result, dir))
result.on('data', fileHandler(result, dir))
})
})
}
Expand Down
9 changes: 0 additions & 9 deletions src/cli/commands/get.js

This file was deleted.

4 changes: 2 additions & 2 deletions src/core/ipfs/files.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ module.exports = function files (self) {
if (data.type === 'directory') {
callback('This dag node is a directory', null)
} else {
const exportEvent = Exporter(hash, self._dagS)
callback(null, exportEvent)
const exportStream = Exporter(hash, self._dagS)
callback(null, exportStream)
}
})
},
Expand Down
50 changes: 50 additions & 0 deletions src/http-api/resources/files.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
'use strict'

const bs58 = require('bs58')
const debug = require('debug')
const log = debug('http-api:files')
log.error = debug('http-api:files:error')

exports = module.exports

// common pre request handler that parses the args and returns `key` which is assigned to `request.pre.args`
exports.parseKey = (request, reply) => {
if (!request.query.arg) {
return reply("Argument 'key' is required").code(400).takeover()
}

try {
return reply({
key: new Buffer(bs58.decode(request.query.arg))
})
} catch (err) {
log.error(err)
return reply({
Message: 'invalid ipfs ref path',
Code: 0
}).code(500).takeover()
}
}

exports.cat = {
// uses common parseKey method that returns a `key`
parseArgs: exports.parseKey,

// main route handler which is called after the above `parseArgs`, but only if the args were valid
handler: (request, reply) => {
const key = request.pre.args.key

request.server.app.ipfs.files.cat(key, (err, stream) => {
if (err) {
log.error(err)
return reply({
Message: 'Failed to cat file: ' + err,
Code: 0
}).code(500)
}
stream.on('data', (data) => {
return reply(data.stream)
})
})
}
}
1 change: 1 addition & 0 deletions src/http-api/resources/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ exports.config = require('./config')
exports.block = require('./block')
exports.swarm = require('./swarm')
exports.bitswap = require('./bitswap')
exports.files = require('./files')
18 changes: 18 additions & 0 deletions src/http-api/routes/files.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
'use strict'

const resources = require('./../resources')

module.exports = (server) => {
const api = server.select('API')

api.route({
method: '*',
path: '/api/v0/cat',
config: {
pre: [
{ method: resources.files.cat.parseArgs, assign: 'args' }
],
handler: resources.files.cat.handler
}
})
}
1 change: 1 addition & 0 deletions src/http-api/routes/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ module.exports = (server) => {
require('./config')(server)
require('./swarm')(server)
require('./bitswap')(server)
require('./files')(server)
}
2 changes: 1 addition & 1 deletion test/cli-tests/test-commands.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ describe('commands', () => {
.run((err, stdout, exitcode) => {
expect(err).to.not.exist
expect(exitcode).to.equal(0)
expect(stdout.length).to.equal(50)
expect(stdout.length).to.equal(48)
done()
})
})
Expand Down
52 changes: 52 additions & 0 deletions test/cli-tests/test-files.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/* eslint-env mocha */
'use strict'

const expect = require('chai').expect
const nexpect = require('nexpect')
const HttpAPI = require('../../src/http-api')
const repoPath = require('./index').repoPath
const _ = require('lodash')

describe('files', () => {
const env = _.clone(process.env)
env.IPFS_PATH = repoPath

describe('api offline', () => {
it('cat', (done) => {
nexpect.spawn('node', [process.cwd() + '/src/cli/bin.js', 'files', 'cat', 'QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o'], {env})
.run((err, stdout, exitcode) => {
expect(err).to.not.exist
expect(exitcode).to.equal(0)
done()
})
})
})

describe('api running', () => {
let httpAPI

before((done) => {
httpAPI = new HttpAPI(repoPath)
httpAPI.start((err) => {
expect(err).to.not.exist
done()
})
})

after((done) => {
httpAPI.stop((err) => {
expect(err).to.not.exist
done()
})
})

it('cat', (done) => {
nexpect.spawn('node', [process.cwd() + '/src/cli/bin.js', 'files', 'cat', 'QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o'], {env})
.run((err, stdout, exitcode) => {
expect(err).to.not.exist
expect(exitcode).to.equal(0)
done()
})
})
})
})
4 changes: 2 additions & 2 deletions test/core-tests/test-files.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ describe('files', () => {
const hash = 'QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o'
ipfs.files.cat(hash, (err, res) => {
expect(err).to.not.exist
res.on('file', (data) => {
res.on('data', (data) => {
data.stream.pipe(bl((err, bldata) => {
expect(err).to.not.exist
expect(bldata.toString()).to.equal('hello world\n')
Expand All @@ -52,7 +52,7 @@ describe('files', () => {
const hash = 'QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o'
ipfs.files.get(hash, (err, res) => {
expect(err).to.not.exist
res.on('file', (data) => {
res.on('data', (data) => {
data.stream.pipe(bl((err, bldata) => {
expect(err).to.not.exist
expect(bldata.toString()).to.equal('hello world\n')
Expand Down
86 changes: 86 additions & 0 deletions test/http-api-tests/test-files.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/* eslint-env mocha */
'use strict'

const expect = require('chai').expect
const APIctl = require('ipfs-api')

module.exports = (httpAPI) => {
describe('files', () => {
describe('api', () => {
let api

it('api', () => {
api = httpAPI.server.select('API')
})

describe('/files/cat', () => {
it('returns 400 for request without argument', (done) => {
api.inject({
method: 'GET',
url: '/api/v0/cat'
}, (res) => {
expect(res.statusCode).to.equal(400)
expect(res.result).to.be.a('string')
done()
})
})

it('returns 500 for request with invalid argument', (done) => {
api.inject({
method: 'GET',
url: '/api/v0/cat?arg=invalid'
}, (res) => {
expect(res.statusCode).to.equal(500)
expect(res.result.Message).to.be.a('string')
done()
})
})

it('returns a buffer', (done) => {
api.inject({
method: 'GET',
url: '/api/v0/cat?arg=QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o'
}, (res) => {
expect(res.statusCode).to.equal(200)
expect(res.rawPayload).to.deep.equal(new Buffer('hello world' + '\n'))
expect(res.payload).to.equal('hello world' + '\n')
done()
})
})
})
})

describe('using js-ipfs-api', () => {
var ctl

it('start IPFS API ctl', (done) => {
ctl = APIctl('/ip4/127.0.0.1/tcp/6001')
done()
})

describe('ipfs.cat', () => {
it('returns error for request without argument', (done) => {
ctl.cat(null, (err, result) => {
expect(err).to.exist
done()
})
})

it('returns error for request with invalid argument', (done) => {
ctl.cat('invalid', (err, result) => {
expect(err).to.exist
done()
})
})

it('returns a buffer', (done) => {
ctl.cat('QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o', (err, result) => {
expect(err).to.not.exist
expect(result).to.deep.equal(new Buffer('hello world' + '\n'))
done()
})
})
})
})
})
}

0 comments on commit 695a536

Please sign in to comment.