1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
var Hash = require("hash").Hash;
// HashP : Case Preserving hash, used for headers
var HashP = exports.HashP = {};
HashP.get = function(hash, key) {
var ikey = _findKey(hash, key);
if (ikey !== null)
return hash[ikey];
// not found
return undefined;
}
HashP.set = function(hash, key, value) {
// do case insensitive search, and delete if present
var ikey = _findKey(hash, key);
if (ikey && ikey !== key)
delete hash[ikey];
// set it, preserving key case
hash[key] = value;
}
HashP.unset = function(hash, key) {
// do case insensitive search, and delete if present
var ikey = _findKey(hash, key),
value;
if (ikey) {
value = hash[ikey];
delete hash[ikey];
}
return value;
}
HashP.includes = function(hash, key) {
return HashP.get(hash, key) !== undefined
}
HashP.merge = function(hash, other) {
var merged = {};
if (hash) HashP.update(merged, hash);
if (other) HashP.update(merged, other);
return merged;
}
HashP.update = function(hash, other) {
for (var key in other)
HashP.set(hash, key, other[key]);
return hash;
}
HashP.forEach = Hash.forEach;
HashP.map = Hash.map;
var _findKey = function(hash, key) {
// optimization
if (hash[key] !== undefined)
return key;
// case insensitive search
var key = key.toLowerCase();
for (var i in hash)
if (i.toLowerCase() === key)
return i;
return null;
}
|