index.jsView |
---|
359 | 359 … | |
360 | 360 … | function getBlob(sbot, id, cb) { |
361 | 361 … | var blobs = sbot.blobs |
362 | 362 … | blobs.size(id, function (err, size) { |
363 | | - if (typeof size === 'number') cb(null, blobs.get(id)) |
| 363 … | + if (err) return cb(err) |
| 364 … | + if (typeof size === 'number') cb(null, blobs.get(id), size) |
364 | 365 … | else blobs.want(id, function (err, got) { |
365 | 366 … | if (err) cb(err) |
366 | 367 … | else if (!got) cb('missing blob ' + id) |
367 | | - else cb(null, blobs.get(id)) |
| 368 … | + else blobs.size(id, function (err, size) { |
| 369 … | + if (err) return cb(err) |
| 370 … | + cb(null, blobs.get(id), size) |
| 371 … | + }) |
368 | 372 … | }) |
369 | 373 … | }) |
370 | 374 … | } |
371 | 375 … | |
477 | 481 … | if (pathname === '/-/bootstrap') return this.serveBootstrap() |
478 | 482 … | if (pathname === '/-/whoami') return this.serveWhoami() |
479 | 483 … | if (pathname === '/-/ping') return this.respond(200, true) |
480 | 484 … | if (pathname === '/-/user/org.couchdb.user:1') return this.serveUser1() |
| 485 … | + if (pathname.startsWith('/-/blobs/get/')) return this.serveBlob(pathname.substr(13)) |
| 486 … | + if (pathname.startsWith('/-/msg/')) return this.serveMsg(pathname.substr(7)) |
481 | 487 … | if ((m = /^\/-\/prebuild\/(.*)$/.exec(pathname))) return this.servePrebuild(m[1]) |
482 | 488 … | if (!/^\/-\//.test(pathname)) return this.servePkg(pathname.substr(1)) |
483 | 489 … | return this.respond(404, {error: 'Not found'}) |
484 | 490 … | } |
496 | 502 … | this.res.writeHead(status, {'content-type': 'text/plain'}) |
497 | 503 … | this.res.end(err.stack || err) |
498 | 504 … | } |
499 | 505 … | |
| 506 … | +Req.prototype.respondRaw = function (status, body) { |
| 507 … | + this.res.writeHead(status) |
| 508 … | + this.res.end(body) |
| 509 … | +} |
| 510 … | + |
500 | 511 … | Req.prototype.serveHome = function () { |
501 | 512 … | var self = this |
502 | 513 … | self.res.writeHead(200, {'content-type': 'text/html'}) |
503 | 514 … | var port = 8044 |
633 | 644 … | Req.prototype.serveUser1 = function () { |
634 | 645 … | this.respond(this.req.method === 'PUT' ? 201 : 200, {token: '1'}) |
635 | 646 … | } |
636 | 647 … | |
| 648 … | +Req.prototype.serveBlob = function (id) { |
| 649 … | + var self = this |
| 650 … | + if (self.req.headers['if-none-match'] === id) return self.respondRaw(304) |
| 651 … | + getBlob(self.server.sbot, id, function (err, readBlob, size) { |
| 652 … | + if (err) { |
| 653 … | + if (/^invalid/.test(err.message)) return self.respondErrorStr(400, err.message) |
| 654 … | + else return self.respondErrorStr(500, err.message || err) |
| 655 … | + } |
| 656 … | + self.res.writeHead(200, { |
| 657 … | + 'Cache-Control': 'public, max-age=315360000', |
| 658 … | + 'Content-Length': size, |
| 659 … | + 'etag': id |
| 660 … | + }) |
| 661 … | + pull( |
| 662 … | + readBlob, |
| 663 … | + toPull(self.res, function (err) { |
| 664 … | + if (err) console.error('[npm-registry]', err) |
| 665 … | + }) |
| 666 … | + ) |
| 667 … | + }) |
| 668 … | +} |
| 669 … | + |
| 670 … | +Req.prototype.serveMsg = function (id) { |
| 671 … | + var self = this |
| 672 … | + try { id = decodeURIComponent(id) } |
| 673 … | + catch (e) {} |
| 674 … | + if (self.req.headers['if-none-match'] === id) return self.respondRaw(304) |
| 675 … | + self.server.sbot.get(id, function (err, value) { |
| 676 … | + if (err) return self.respondError(500, err.message || err) |
| 677 … | + var out = new Buffer(JSON.stringify({key: id, value: value}, null, 2), 'utf8') |
| 678 … | + self.res.writeHead(200, { |
| 679 … | + 'Content-Type': 'application/json', |
| 680 … | + 'Cache-Control': 'public, max-age=315360000', |
| 681 … | + 'Content-Length': out.length, |
| 682 … | + 'etag': id |
| 683 … | + }) |
| 684 … | + self.res.end(out) |
| 685 … | + }) |
| 686 … | +} |
| 687 … | + |
637 | 688 … | function decodeName(name) { |
638 | 689 … | var parts = String(name).replace(/\.tgz$/, '').split(':') |
639 | 690 … | return { |
640 | 691 … | name: parts[1], |