Skip to content

Instantly share code, notes, and snippets.

@shripadk
Created September 26, 2010 16:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shripadk/598084 to your computer and use it in GitHub Desktop.
Save shripadk/598084 to your computer and use it in GitHub Desktop.
From 7cb51a4207a279f3f91dea854b6d70454a5fdb99 Mon Sep 17 00:00:00 2001
From: Joe ST <joe@fbstj.net>
Date: Thu, 26 Aug 2010 21:09:32 +0100
Subject: [PATCH] Adds HTTP basic auth
Signed-off-by: Joe ST <joe@fbstj.net>
---
lib/base64.js | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
lib/cradle.js | 15 +++++++-
2 files changed, 124 insertions(+), 2 deletions(-)
create mode 100644 lib/base64.js
diff --git a/lib/base64.js b/lib/base64.js
new file mode 100644
index 0000000..7048c1e
--- /dev/null
+++ b/lib/base64.js
@@ -0,0 +1,111 @@
+//FROM http://github.com/felixge/node-couchdb/raw/master/lib/dep/base64.js
+/* adapted by Jed Schmidt for use as a node.js module */
+
+this.encode = base64encode;
+this.decode = base64decode;
+this.chars = function( string ) {
+ base64EncodeChars = string || "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+ base64DecodeChars = [];
+
+ for ( var i = 128; i--; ) {
+ if ( base64DecodeChars[ i ] === undefined )
+ base64DecodeChars[ i ] = -1;
+
+ base64DecodeChars[ base64EncodeChars.charCodeAt( i ) ] = i;
+ }
+
+ return this;
+
+};
+
+this.chars();
+
+/* Copyright (C) 1999 Masanao Izumo <iz@onicos.co.jp>
+ * Version: 1.0
+ * LastModified: Dec 25 1999
+ * This library is free. You can redistribute it and/or modify it.
+ */
+
+function base64encode( str ) {
+ var out, i, len;
+ var c1, c2, c3;
+
+ len = str.length;
+ i = 0;
+ out = "";
+ while(i < len) {
+ c1 = str.charCodeAt(i++) & 0xff;
+ if(i == len)
+ {
+ out += base64EncodeChars.charAt(c1 >> 2);
+ out += base64EncodeChars.charAt((c1 & 0x3) << 4);
+ out += "==";
+ break;
+ }
+ c2 = str.charCodeAt(i++);
+ if(i == len)
+ {
+ out += base64EncodeChars.charAt(c1 >> 2);
+ out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
+ out += base64EncodeChars.charAt((c2 & 0xF) << 2);
+ out += "=";
+ break;
+ }
+ c3 = str.charCodeAt(i++);
+ out += base64EncodeChars.charAt(c1 >> 2);
+ out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
+ out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
+ out += base64EncodeChars.charAt(c3 & 0x3F);
+ }
+ return out;
+}
+
+function base64decode( str ) {
+ var c1, c2, c3, c4;
+ var i, len, out;
+
+ len = str.length;
+ i = 0;
+ out = "";
+ while(i < len) {
+ /* c1 */
+ do {
+ c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
+ } while(i < len && c1 == -1);
+ if(c1 == -1)
+ break;
+
+ /* c2 */
+ do {
+ c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
+ } while(i < len && c2 == -1);
+ if(c2 == -1)
+ break;
+
+ out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
+
+ /* c3 */
+ do {
+ c3 = str.charCodeAt(i++) & 0xff;
+ if(c3 == 61)
+ return out;
+ c3 = base64DecodeChars[c3];
+ } while(i < len && c3 == -1);
+ if(c3 == -1)
+ break;
+
+ out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
+
+ /* c4 */
+ do {
+ c4 = str.charCodeAt(i++) & 0xff;
+ if(c4 == 61)
+ return out;
+ c4 = base64DecodeChars[c4];
+ } while(i < len && c4 == -1);
+ if(c4 == -1)
+ break;
+ out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
+ }
+ return out;
+}
diff --git a/lib/cradle.js b/lib/cradle.js
index 5c72246..8b04b2a 100644
--- a/lib/cradle.js
+++ b/lib/cradle.js
@@ -10,6 +10,7 @@ var sys = require("sys"),
var querystring = require('querystring');
var Args = require('vargs').Constructor;
+var encode_64 = require('base64').encode; //
var cradle = exports;
@@ -35,6 +36,8 @@ cradle.Connection = function Connection(/* variable args */) {
var args = Array.prototype.slice.call(arguments),
host, port, remote, options = {};
+ this.auth = {};
+
if (typeof(args[0]) === 'string') {
remote = args[0].replace('http://', '').split(':');
host = remote[0];
@@ -46,11 +49,16 @@ cradle.Connection = function Connection(/* variable args */) {
options = args[0];
host = options.host;
port = parseInt(options.port);
+ var a = options.auth;
+ if(a && a.user && a.pass)
+ this.auth = { user:a.user, pass:a.pass };
// The host and port were passed separately
} else if (args.length >= 2) {
host = args[0];
port = parseInt(args[1]);
options = args[2] || {};
+ if(args[3] && args[4])
+ this.auth = { user: args[3], pass: args[4] };
}
this.host = host || cradle.host;
@@ -69,10 +77,13 @@ cradle.Connection = function Connection(/* variable args */) {
// content
//
cradle.Connection.prototype.rawRequest = function (method, path, options, data, headers) {
- var promise = new(events.EventEmitter), request, that = this;
+ var promise = new(events.EventEmitter), request, that = this, a = this.auth;
// HTTP Headers
- headers = cradle.merge({ host: this.host }, headers || {});
+ var h = {};
+ if(a && a.user && a.pass)
+ h['Authorization'] = "Basic "+encode_64(a.user +':'+a.pass);
+ headers = cradle.merge({ host: this.host }, headers || {}, h);
path = (path || '/').replace('http://','').replace(/\/{2,}/g, '/');
if (path.charAt(0) !== '/') { path = '/' + path }
--
1.7.2.2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment