1
+ <!DOCTYPE html> < html > < head > < title > balancing-proxy.js</ title > < meta http-equiv ="content-type " content ="text/html; charset=UTF-8 "> < link rel ="stylesheet " media ="all " href ="docco.css " /> </ head > < body > < div id ="container "> < div id ="background "> </ div > < div id ="jump_to "> Jump To … < div id ="jump_wrapper "> < div id ="jump_page "> < a class ="source " href ="balancing-proxy.html "> balancing-proxy.html </ a > < a class ="source " href ="node-http-proxy.html "> node-http-proxy.html </ a > < a class ="source " href ="proxy-table.html "> proxy-table.html </ a > </ div > </ div > </ div > < table cellpadding ="0 " cellspacing ="0 "> < thead > < tr > < th class ="docs "> < h1 > balancing-proxy.js </ h1 > </ th > < th class ="code "> </ th > </ tr > </ thead > < tbody > < tr id ="section-1 "> < td class ="docs "> < div class ="pilwrap "> < a class ="pilcrow " href ="#section-1 "> ¶</ a > </ div > </ td > < td class ="code "> < div class ="highlight "> < pre > < span class ="cm "> /*</ span >
2
+ < span class ="cm "> balancing-proxy.js: Transparent Load-Balancing Optimized HTTP Proxy </ span >
3
+
4
+ < span class ="cm "> Copyright (c) 2011 Charlie Robbins </ span >
5
+
6
+ < span class ="cm "> Permission is hereby granted, free of charge, to any person obtaining</ span >
7
+ < span class ="cm "> a copy of this software and associated documentation files (the</ span >
8
+ < span class ="cm "> "Software"), to deal in the Software without restriction, including</ span >
9
+ < span class ="cm "> without limitation the rights to use, copy, modify, merge, publish,</ span >
10
+ < span class ="cm "> distribute, sublicense, and/or sell copies of the Software, and to</ span >
11
+ < span class ="cm "> permit persons to whom the Software is furnished to do so, subject to</ span >
12
+ < span class ="cm "> the following conditions:</ span >
13
+
14
+ < span class ="cm "> The above copyright notice and this permission notice shall be</ span >
15
+ < span class ="cm "> included in all copies or substantial portions of the Software.</ span >
16
+
17
+ < span class ="cm "> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,</ span >
18
+ < span class ="cm "> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF</ span >
19
+ < span class ="cm "> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND</ span >
20
+ < span class ="cm "> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE</ span >
21
+ < span class ="cm "> LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION</ span >
22
+ < span class ="cm "> OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION</ span >
23
+ < span class ="cm "> WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</ span >
24
+
25
+ < span class ="cm "> */</ span >
26
+
27
+ < span class ="kd "> var</ span > < span class ="nx "> net</ span > < span class ="o "> =</ span > < span class ="nx "> require</ span > < span class ="p "> (</ span > < span class ="s1 "> 'net'</ span > < span class ="p "> ),</ span >
28
+ < span class ="nx "> HTTPParser</ span > < span class ="o "> =</ span > < span class ="nx "> process</ span > < span class ="p "> .</ span > < span class ="nx "> binding</ span > < span class ="p "> (</ span > < span class ="s1 "> 'http_parser'</ span > < span class ="p "> ).</ span > < span class ="nx "> HTTPParser</ span > < span class ="p "> ,</ span >
29
+ < span class ="nx "> streams</ span > < span class ="o "> =</ span > < span class ="nx "> require</ span > < span class ="p "> (</ span > < span class ="s1 "> 'morestreams'</ span > < span class ="p "> );</ span >
30
+
31
+ < span class ="nx "> exports</ span > < span class ="p "> .</ span > < span class ="nx "> createServer</ span > < span class ="o "> =</ span > < span class ="kd "> function</ span > < span class ="p "> ()</ span > < span class ="p "> {</ span >
32
+ < span class ="kd "> var</ span > < span class ="nx "> args</ span > < span class ="o "> =</ span > < span class ="nb "> Array</ span > < span class ="p "> .</ span > < span class ="nx "> prototype</ span > < span class ="p "> .</ span > < span class ="nx "> slice</ span > < span class ="p "> .</ span > < span class ="nx "> call</ span > < span class ="p "> (</ span > < span class ="nx "> arguments</ span > < span class ="p "> ),</ span >
33
+ < span class ="nx "> callback</ span > < span class ="o "> =</ span > < span class ="k "> typeof</ span > < span class ="nx "> args</ span > < span class ="p "> [</ span > < span class ="mi "> 0</ span > < span class ="p "> ]</ span > < span class ="o "> ===</ span > < span class ="s1 "> 'function'</ span > < span class ="o "> &&</ span > < span class ="nx "> args</ span > < span class ="p "> .</ span > < span class ="nx "> shift</ span > < span class ="p "> (),</ span >
34
+ < span class ="nx "> options</ span > < span class ="o "> =</ span > < span class ="p "> {},</ span > < span class ="nx "> port</ span > < span class ="p "> ,</ span > < span class ="nx "> host</ span > < span class ="p "> ,</ span > < span class ="nx "> server</ span > < span class ="p "> ;</ span >
35
+
36
+ < span class ="nx "> server</ span > < span class ="o "> =</ span > < span class ="nx "> net</ span > < span class ="p "> .</ span > < span class ="nx "> createServer</ span > < span class ="p "> (</ span > < span class ="kd "> function</ span > < span class ="p "> (</ span > < span class ="nx "> socket</ span > < span class ="p "> )</ span > < span class ="p "> {</ span >
37
+ < span class ="kd "> var</ span > < span class ="nx "> buffer</ span > < span class ="o "> =</ span > < span class ="k "> new</ span > < span class ="nx "> streams</ span > < span class ="p "> .</ span > < span class ="nx "> BufferedStream</ span > < span class ="p "> (),</ span >
38
+ < span class ="nx "> parser</ span > < span class ="o "> =</ span > < span class ="k "> new</ span > < span class ="nx "> HTTPParser</ span > < span class ="p "> (</ span > < span class ="s1 "> 'request'</ span > < span class ="p "> );</ span >
39
+
40
+ < span class ="nx "> parser</ span > < span class ="p "> .</ span > < span class ="nx "> onHeaderField</ span > < span class ="o "> =</ span > < span class ="kd "> function</ span > < span class ="p "> (</ span > < span class ="nx "> b</ span > < span class ="p "> ,</ span > < span class ="nx "> start</ span > < span class ="p "> ,</ span > < span class ="nx "> len</ span > < span class ="p "> )</ span > < span class ="p "> {</ span >
41
+ < span class ="kd "> var</ span > < span class ="nx "> slice</ span > < span class ="o "> =</ span > < span class ="nx "> b</ span > < span class ="p "> .</ span > < span class ="nx "> toString</ span > < span class ="p "> (</ span > < span class ="s1 "> 'ascii'</ span > < span class ="p "> ,</ span > < span class ="nx "> start</ span > < span class ="p "> ,</ span > < span class ="nx "> start</ span > < span class ="o "> +</ span > < span class ="nx "> len</ span > < span class ="p "> ).</ span > < span class ="nx "> toLowerCase</ span > < span class ="p "> ();</ span >
42
+ < span class ="k "> if</ span > < span class ="p "> (</ span > < span class ="nx "> parser</ span > < span class ="p "> .</ span > < span class ="nx "> value</ span > < span class ="o "> !=</ span > < span class ="kc "> undefined</ span > < span class ="p "> )</ span > < span class ="p "> {</ span >
43
+ < span class ="nx "> require</ span > < span class ="p "> (</ span > < span class ="s1 "> 'eyes'</ span > < span class ="p "> ).</ span > < span class ="nx "> inspect</ span > < span class ="p "> (</ span > < span class ="nx "> parser</ span > < span class ="p "> .</ span > < span class ="nx "> value</ span > < span class ="p "> ,</ span > < span class ="nx "> parser</ span > < span class ="p "> .</ span > < span class ="nx "> field</ span > < span class ="p "> );</ span >
44
+ < span class ="nx "> parser</ span > < span class ="p "> .</ span > < span class ="nx "> field</ span > < span class ="o "> =</ span > < span class ="kc "> null</ span > < span class ="p "> ;</ span >
45
+ < span class ="nx "> parser</ span > < span class ="p "> .</ span > < span class ="nx "> value</ span > < span class ="o "> =</ span > < span class ="kc "> null</ span > < span class ="p "> ;</ span >
46
+ < span class ="p "> }</ span >
47
+ < span class ="k "> if</ span > < span class ="p "> (</ span > < span class ="nx "> parser</ span > < span class ="p "> .</ span > < span class ="nx "> field</ span > < span class ="p "> )</ span > < span class ="p "> {</ span >
48
+ < span class ="nx "> parser</ span > < span class ="p "> .</ span > < span class ="nx "> field</ span > < span class ="o "> +=</ span > < span class ="nx "> slice</ span > < span class ="p "> ;</ span >
49
+ < span class ="p "> }</ span > < span class ="k "> else</ span > < span class ="p "> {</ span >
50
+ < span class ="nx "> parser</ span > < span class ="p "> .</ span > < span class ="nx "> field</ span > < span class ="o "> =</ span > < span class ="nx "> slice</ span > < span class ="p "> ;</ span >
51
+ < span class ="p "> }</ span >
52
+ < span class ="p "> };</ span >
53
+
54
+ < span class ="nx "> parser</ span > < span class ="p "> .</ span > < span class ="nx "> onHeaderValue</ span > < span class ="o "> =</ span > < span class ="kd "> function</ span > < span class ="p "> (</ span > < span class ="nx "> b</ span > < span class ="p "> ,</ span > < span class ="nx "> start</ span > < span class ="p "> ,</ span > < span class ="nx "> len</ span > < span class ="p "> )</ span > < span class ="p "> {</ span >
55
+ < span class ="kd "> var</ span > < span class ="nx "> slice</ span > < span class ="o "> =</ span > < span class ="nx "> b</ span > < span class ="p "> .</ span > < span class ="nx "> toString</ span > < span class ="p "> (</ span > < span class ="s1 "> 'ascii'</ span > < span class ="p "> ,</ span > < span class ="nx "> start</ span > < span class ="p "> ,</ span > < span class ="nx "> start</ span > < span class ="o "> +</ span > < span class ="nx "> len</ span > < span class ="p "> );</ span >
56
+ < span class ="k "> if</ span > < span class ="p "> (</ span > < span class ="nx "> parser</ span > < span class ="p "> .</ span > < span class ="nx "> value</ span > < span class ="p "> )</ span > < span class ="p "> {</ span >
57
+ < span class ="nx "> parser</ span > < span class ="p "> .</ span > < span class ="nx "> value</ span > < span class ="o "> +=</ span > < span class ="nx "> slice</ span > < span class ="p "> ;</ span >
58
+ < span class ="p "> }</ span > < span class ="k "> else</ span > < span class ="p "> {</ span >
59
+ < span class ="nx "> parser</ span > < span class ="p "> .</ span > < span class ="nx "> value</ span > < span class ="o "> =</ span > < span class ="nx "> slice</ span > < span class ="p "> ;</ span >
60
+ < span class ="p "> }</ span >
61
+ < span class ="p "> };</ span >
62
+
63
+ < span class ="nx "> parser</ span > < span class ="p "> .</ span > < span class ="nx "> socket</ span > < span class ="o "> =</ span > < span class ="nx "> socket</ span > < span class ="p "> ;</ span >
64
+
65
+ < span class ="nx "> socket</ span > < span class ="p "> .</ span > < span class ="nx "> ondata</ span > < span class ="o "> =</ span > < span class ="kd "> function</ span > < span class ="p "> (</ span > < span class ="nx "> d</ span > < span class ="p "> ,</ span > < span class ="nx "> start</ span > < span class ="p "> ,</ span > < span class ="nx "> end</ span > < span class ="p "> )</ span > < span class ="p "> {</ span >
66
+ < span class ="kd "> var</ span > < span class ="nx "> ret</ span > < span class ="o "> =</ span > < span class ="nx "> parser</ span > < span class ="p "> .</ span > < span class ="nx "> execute</ span > < span class ="p "> (</ span > < span class ="nx "> d</ span > < span class ="p "> ,</ span > < span class ="nx "> start</ span > < span class ="p "> ,</ span > < span class ="nx "> end</ span > < span class ="o "> -</ span > < span class ="nx "> start</ span > < span class ="p "> );</ span >
67
+ < span class ="nx "> console</ span > < span class ="p "> .</ span > < span class ="nx "> log</ span > < span class ="p "> (</ span > < span class ="nx "> ret</ span > < span class ="p "> );</ span >
68
+ < span class ="p "> };</ span >
69
+
70
+ < span class ="nx "> socket</ span > < span class ="p "> .</ span > < span class ="nx "> onend</ span > < span class ="o "> =</ span > < span class ="kd "> function</ span > < span class ="p "> ()</ span > < span class ="p "> {</ span >
71
+ < span class ="kd "> var</ span > < span class ="nx "> ret</ span > < span class ="o "> =</ span > < span class ="nx "> parser</ span > < span class ="p "> .</ span > < span class ="nx "> finish</ span > < span class ="p "> ();</ span >
72
+
73
+ < span class ="k "> if</ span > < span class ="p "> (</ span > < span class ="nx "> ret</ span > < span class ="k "> instanceof</ span > < span class ="nb "> Error</ span > < span class ="p "> )</ span > < span class ="p "> {</ span >
74
+ < span class ="nx "> socket</ span > < span class ="p "> .</ span > < span class ="nx "> destroy</ span > < span class ="p "> (</ span > < span class ="nx "> ret</ span > < span class ="p "> );</ span >
75
+ < span class ="k "> return</ span > < span class ="p "> ;</ span >
76
+ < span class ="p "> }</ span >
77
+
78
+ < span class ="k "> if</ span > < span class ="p "> (</ span > < span class ="nx "> socket</ span > < span class ="p "> .</ span > < span class ="nx "> writable</ span > < span class ="p "> )</ span > < span class ="p "> {</ span >
79
+ < span class ="nx "> socket</ span > < span class ="p "> .</ span > < span class ="nx "> end</ span > < span class ="p "> ();</ span >
80
+ < span class ="p "> }</ span >
81
+ < span class ="p "> };</ span >
82
+
83
+ < span class ="nx "> socket</ span > < span class ="p "> .</ span > < span class ="nx "> write</ span > < span class ="p "> (</ span > < span class ="s1 "> 'hello world'</ span > < span class ="p "> );</ span >
84
+ < span class ="nx "> socket</ span > < span class ="p "> .</ span > < span class ="nx "> end</ span > < span class ="p "> ();</ span >
85
+ < span class ="p "> });</ span >
86
+
87
+ < span class ="k "> return</ span > < span class ="nx "> server</ span > < span class ="p "> ;</ span >
88
+ < span class ="p "> };</ span >
89
+
90
+ </ pre > </ div > </ td > </ tr > </ tbody > </ table > </ div > </ body > </ html >
0 commit comments