@@ -8,11 +8,12 @@ const path = require('path'),
8
8
WebSocket = require ( 'ws' ) ,
9
9
{ Messanger } = require ( '../server/ws-message' ) ,
10
10
{ getLogger } = require ( '../lib/logger' ) ,
11
+ { getIPAddress } = require ( '../lib/utils' ) ,
11
12
config = require ( '../config' ) ,
12
13
13
14
debug = getLogger . debug ( { prefix : '\u001b[34mC:d' , postfix : '\u001b[0m\n' } ) ,
14
15
info = getLogger . info ( { prefix : '\u001b[34mC:i' , postfix : '\u001b[0m\n' } ) ,
15
- warning = getLogger . info ( { prefix : '\u001b[35mC:i' , postfix : '\u001b[0m\n' } ) ;
16
+ warning = getLogger . warning ( { prefix : '\u001b[35mC:i' , postfix : '\u001b[0m\n' } ) ;
16
17
17
18
class InvalidRequestError extends Error { } // Received an invalid request from proxy server side
18
19
@@ -97,7 +98,9 @@ class Channel extends Object {
97
98
this . timeout = handler . maxChannelLivespan ;
98
99
99
100
this . _timeoutTimer = new Timer ( ( ) => {
100
- this . request . emit ( 'error' , 'The request timed out.' ) ;
101
+ if ( this . request && this . request . emit ) {
102
+ this . request . emit ( 'error' , 'The request timed out.' ) ;
103
+ }
101
104
} , this . timeout ) ;
102
105
}
103
106
@@ -132,11 +135,39 @@ class Channel extends Object {
132
135
return this ;
133
136
}
134
137
138
+ /**
139
+ * Internal (not forwarded api endpoint on /$ip
140
+ */
141
+ internal_request_ip ( ireq , forwardToUrl ) {
142
+ this . _send ( 'headers' , {
143
+ statusCode : '200' ,
144
+ statusMessage : 'OK' ,
145
+ headers : { 'Content-Type' : 'application/json; charset=utf-8' } ,
146
+ } ) ;
147
+ this . url = ireq . url ;
148
+ this . request = { end : ( ) => {
149
+
150
+ let ipAddress ;
151
+ if ( [ 'localhost' , '127.0.0.1' , ] . indexOf ( forwardToUrl . hostname ) >= 0 ) {
152
+ ipAddress = getIPAddress ( ) ;
153
+ } else {
154
+ ipAddress = forwardToUrl . hostname ;
155
+ }
156
+ this . onHttpData ( JSON . stringify ( {
157
+ 'ipAddress' : ipAddress ,
158
+ } ) ) ;
159
+ this . onHttpEnd ( ) ;
160
+ } } ;
161
+ }
162
+
135
163
on_headers ( message ) {
136
164
this . _timeoutTimer . reset ( )
137
165
const ireq = message . data ;
138
166
debug ( `< ${ this . id } : ${ ireq . method } ${ ireq . url } ` ) ;
139
167
const forwardToUrl = new URL ( this . forwardTo ) ; // clone the original uri
168
+ if ( ireq . url == '/$ip' ) {
169
+ return this . internal_request_ip ( ireq , forwardToUrl ) ;
170
+ }
140
171
forwardToUrl . href = path . posix . join ( forwardToUrl . href , ireq . url ) ;
141
172
// TODO: Port setup should be packed in message on WS server part
142
173
if ( ireq . headers [ 'x-karmen-port' ] ) {
@@ -245,7 +276,6 @@ class PingPongGamer extends Object {
245
276
246
277
onMessage ( message ) {
247
278
// record that server was life (even for non-pong messages)
248
- debug ( 'Pong' ) ;
249
279
this . gotMessage = true ;
250
280
if ( message . event == 'ping' ) {
251
281
this . ws . send ( message . channel , 'pong' ) ;
0 commit comments