Browse files

[api test] Added mime-types. Updated StorageObject.

  • Loading branch information...
1 parent 00a3268 commit e32cc12e87171e8337c1f05d7a3cbae7bf4185be @indexzero indexzero committed Oct 7, 2010
Showing with 258 additions and 9 deletions.
  1. +3 −0 lib/cloudfiles.js
  2. +1 −2 lib/cloudfiles/core.js
  3. +205 −0 lib/cloudfiles/mime.js
  4. +7 −7 lib/cloudfiles/storage-object.js
  5. +42 −0 test/mime-test.js
View
3 lib/cloudfiles.js
@@ -27,3 +27,6 @@ cloudfiles.getFiles = require('cloudfiles/core').getFiles;
cloudfiles.getFile = require('cloudfiles/core').getFile;
cloudfiles.addFile = require('cloudfiles/core').addFile;
cloudfiles.destroyFile = require('cloudfiles/core').destroyFile;
+
+// Mime types
+cloudfiles.mime = require('cloudfiles/mime').mime;
View
3 lib/cloudfiles/core.js
@@ -153,8 +153,7 @@ core.addFile = function (container, file, data, callback) {
body: data,
headers: {
'Transfer-Encoding': 'chunked',
- // TODO: We should be determining MIME-TYPE somehow
- 'Content-Type': 'text/plain; charset=UTF-8'
+ 'Content-Type': cloudfiles.mime.type(file)
}
};
View
205 lib/cloudfiles/mime.js
@@ -0,0 +1,205 @@
+/*
+ * mime.js: Utility module for determining file mime-types
+ *
+ * (C) 2010 Charlie Robbins
+ * MIT LICENSE
+ *
+ */
+
+var defaultMime = exports.defaultMime = 'text/plain';
+
+exports.mime = {
+
+ /**
+ * Return mime type for the given path,
+ * otherwise default to exports.defaultMime
+ * ("application/octet-stream").
+ *
+ * @param {String} path
+ * @return {String}
+ * @api public
+ */
+
+ type: function getMime(path) {
+ var index = String(path).lastIndexOf(".");
+ if (index < 0) {
+ return defaultMime;
+ }
+ var type = exports.mime.types[path.substring(index).toLowerCase()] || defaultMime;
+ return (/(text|javascript)/).test(type) ? type + "; charset=utf-8" : type;
+ },
+
+ /**
+ * Mime types.
+ */
+
+ types: {
+ ".3gp" : "video/3gpp",
+ ".a" : "application/octet-stream",
+ ".ai" : "application/postscript",
+ ".aif" : "audio/x-aiff",
+ ".aiff" : "audio/x-aiff",
+ ".asc" : "application/pgp-signature",
+ ".asf" : "video/x-ms-asf",
+ ".asm" : "text/x-asm",
+ ".asx" : "video/x-ms-asf",
+ ".atom" : "application/atom+xml",
+ ".au" : "audio/basic",
+ ".avi" : "video/x-msvideo",
+ ".bat" : "application/x-msdownload",
+ ".bin" : "application/octet-stream",
+ ".bmp" : "image/bmp",
+ ".bz2" : "application/x-bzip2",
+ ".c" : "text/x-c",
+ ".cab" : "application/vnd.ms-cab-compressed",
+ ".cc" : "text/x-c",
+ ".chm" : "application/vnd.ms-htmlhelp",
+ ".class" : "application/octet-stream",
+ ".com" : "application/x-msdownload",
+ ".conf" : "text/plain",
+ ".cpp" : "text/x-c",
+ ".crt" : "application/x-x509-ca-cert",
+ ".css" : "text/css",
+ ".csv" : "text/csv",
+ ".cxx" : "text/x-c",
+ ".deb" : "application/x-debian-package",
+ ".der" : "application/x-x509-ca-cert",
+ ".diff" : "text/x-diff",
+ ".djv" : "image/vnd.djvu",
+ ".djvu" : "image/vnd.djvu",
+ ".dll" : "application/x-msdownload",
+ ".dmg" : "application/octet-stream",
+ ".doc" : "application/msword",
+ ".dot" : "application/msword",
+ ".dtd" : "application/xml-dtd",
+ ".dvi" : "application/x-dvi",
+ ".ear" : "application/java-archive",
+ ".eml" : "message/rfc822",
+ ".eps" : "application/postscript",
+ ".exe" : "application/x-msdownload",
+ ".f" : "text/x-fortran",
+ ".f77" : "text/x-fortran",
+ ".f90" : "text/x-fortran",
+ ".flv" : "video/x-flv",
+ ".for" : "text/x-fortran",
+ ".gem" : "application/octet-stream",
+ ".gemspec" : "text/x-script.ruby",
+ ".gif" : "image/gif",
+ ".gz" : "application/x-gzip",
+ ".h" : "text/x-c",
+ ".hh" : "text/x-c",
+ ".htm" : "text/html",
+ ".html" : "text/html",
+ ".ico" : "image/vnd.microsoft.icon",
+ ".ics" : "text/calendar",
+ ".ifb" : "text/calendar",
+ ".iso" : "application/octet-stream",
+ ".jar" : "application/java-archive",
+ ".java" : "text/x-java-source",
+ ".jnlp" : "application/x-java-jnlp-file",
+ ".jpeg" : "image/jpeg",
+ ".jpg" : "image/jpeg",
+ ".js" : "application/javascript",
+ ".json" : "application/json",
+ ".log" : "text/plain",
+ ".m3u" : "audio/x-mpegurl",
+ ".m4v" : "video/mp4",
+ ".man" : "text/troff",
+ ".mathml" : "application/mathml+xml",
+ ".mbox" : "application/mbox",
+ ".mdoc" : "text/troff",
+ ".me" : "text/troff",
+ ".mid" : "audio/midi",
+ ".midi" : "audio/midi",
+ ".mime" : "message/rfc822",
+ ".mml" : "application/mathml+xml",
+ ".mng" : "video/x-mng",
+ ".mov" : "video/quicktime",
+ ".mp3" : "audio/mpeg",
+ ".mp4" : "video/mp4",
+ ".mp4v" : "video/mp4",
+ ".mpeg" : "video/mpeg",
+ ".mpg" : "video/mpeg",
+ ".ms" : "text/troff",
+ ".msi" : "application/x-msdownload",
+ ".odp" : "application/vnd.oasis.opendocument.presentation",
+ ".ods" : "application/vnd.oasis.opendocument.spreadsheet",
+ ".odt" : "application/vnd.oasis.opendocument.text",
+ ".ogg" : "application/ogg",
+ ".p" : "text/x-pascal",
+ ".pas" : "text/x-pascal",
+ ".pbm" : "image/x-portable-bitmap",
+ ".pdf" : "application/pdf",
+ ".pem" : "application/x-x509-ca-cert",
+ ".pgm" : "image/x-portable-graymap",
+ ".pgp" : "application/pgp-encrypted",
+ ".pkg" : "application/octet-stream",
+ ".pl" : "text/x-script.perl",
+ ".pm" : "text/x-script.perl-module",
+ ".png" : "image/png",
+ ".pnm" : "image/x-portable-anymap",
+ ".ppm" : "image/x-portable-pixmap",
+ ".pps" : "application/vnd.ms-powerpoint",
+ ".ppt" : "application/vnd.ms-powerpoint",
+ ".ps" : "application/postscript",
+ ".psd" : "image/vnd.adobe.photoshop",
+ ".py" : "text/x-script.python",
+ ".qt" : "video/quicktime",
+ ".ra" : "audio/x-pn-realaudio",
+ ".rake" : "text/x-script.ruby",
+ ".ram" : "audio/x-pn-realaudio",
+ ".rar" : "application/x-rar-compressed",
+ ".rb" : "text/x-script.ruby",
+ ".rdf" : "application/rdf+xml",
+ ".roff" : "text/troff",
+ ".rpm" : "application/x-redhat-package-manager",
+ ".rss" : "application/rss+xml",
+ ".rtf" : "application/rtf",
+ ".ru" : "text/x-script.ruby",
+ ".s" : "text/x-asm",
+ ".sgm" : "text/sgml",
+ ".sgml" : "text/sgml",
+ ".sh" : "application/x-sh",
+ ".sig" : "application/pgp-signature",
+ ".snd" : "audio/basic",
+ ".so" : "application/octet-stream",
+ ".svg" : "image/svg+xml",
+ ".svgz" : "image/svg+xml",
+ ".swf" : "application/x-shockwave-flash",
+ ".t" : "text/troff",
+ ".tar" : "application/x-tar",
+ ".tbz" : "application/x-bzip-compressed-tar",
+ ".tci" : "application/x-topcloud",
+ ".tcl" : "application/x-tcl",
+ ".tex" : "application/x-tex",
+ ".texi" : "application/x-texinfo",
+ ".texinfo" : "application/x-texinfo",
+ ".text" : "text/plain",
+ ".tif" : "image/tiff",
+ ".tiff" : "image/tiff",
+ ".torrent" : "application/x-bittorrent",
+ ".tr" : "text/troff",
+ ".ttf" : "application/x-font-ttf",
+ ".txt" : "text/plain",
+ ".vcf" : "text/x-vcard",
+ ".vcs" : "text/x-vcalendar",
+ ".vrml" : "model/vrml",
+ ".war" : "application/java-archive",
+ ".wav" : "audio/x-wav",
+ ".wma" : "audio/x-ms-wma",
+ ".wmv" : "video/x-ms-wmv",
+ ".wmx" : "video/x-ms-wmx",
+ ".wrl" : "model/vrml",
+ ".wsdl" : "application/wsdl+xml",
+ ".xbm" : "image/x-xbitmap",
+ ".xhtml" : "application/xhtml+xml",
+ ".xls" : "application/vnd.ms-excel",
+ ".xml" : "application/xml",
+ ".xpm" : "image/x-xpixmap",
+ ".xsl" : "application/xml",
+ ".xslt" : "application/xslt+xml",
+ ".yaml" : "text/yaml",
+ ".yml" : "text/yaml",
+ ".zip" : "application/zip"
+ }
+};
View
14 lib/cloudfiles/storage-object.js
@@ -42,11 +42,8 @@ StorageObject.prototype = {
});
},
- destroy: function () {
- utils.rackspace('DELETE', this.fullPath, callback, function (body, res) {
- eyes.inspect(body);
- eyes.inspect(res.statusCode);
- });
+ destroy: function (callback) {
+ cloudfiles.destroyFile(this.containerName, this.name, callback);
},
getMetadata: function () {
@@ -62,8 +59,11 @@ StorageObject.prototype = {
},
get fullPath() {
- var containerName = this.container instanceof cloudfiles.Container ? this.container.name : this.container;
- return utils.storageUrl(containerName, this.name);
+ return utils.storageUrl(this.containerName, this.name);
+ },
+
+ get containerName() {
+ return this.container instanceof cloudfiles.Container ? this.container.name : this.container;
},
_setProperties: function (details) {
View
42 test/mime-test.js
@@ -0,0 +1,42 @@
+/*
+ * mime-test.js: Tests for mime type indentification
+ *
+ * (C) 2010 Charlie Robbins
+ * MIT LICENSE
+ *
+ */
+
+var path = require('path'),
+ vows = require('vows'),
+ eyes = require('eyes'),
+ fs = require('fs'),
+ assert = require('assert');
+
+require.paths.unshift(path.join(__dirname, '..', 'lib'));
+
+var cloudfiles = require('cloudfiles');
+
+var tests = {};
+
+// Create a test for each mime type
+Object.keys(cloudfiles.mime.types).forEach(function (ext) {
+ var mimeType = cloudfiles.mime.types[ext],
+ test = 'when passed a ' + ext + ' file',
+ assertion = "should response with " + mimeType + " mimetype";
+
+ tests[test] = { };
+ tests[test][assertion] = function () {
+ var testType = cloudfiles.mime.type('someFile' + ext);
+ assert.isTrue(testType.indexOf(mimeType) !== -1);
+ };
+});
+
+// Create a batch for the specified mime type
+var batch = {
+ "When using the node-cloudfiles client": {
+ "the mime type module": tests
+ }
+};
+
+// Export the batch with vows
+vows.describe('cloudfiles/mime').addBatch(batch).export(module);

0 comments on commit e32cc12

Please sign in to comment.