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