Fix exception when logging invalid session

Resolves #269
This commit is contained in:
Zaid Abdulla committed 2017-10-23 17:09:37 -07:00
1 parent 9dcd55a84f
commit b152071085
1 file changed
+15 -19
+15 -19
View File
@@ -853,9 +853,6 @@ listener = (httpRequest, httpResponse) ->
) )
parsedRpc = (sessionContext, rpc, parseWarnings) -> parsedRpc = (sessionContext, rpc, parseWarnings) ->
sessionContext.httpRequest = httpRequest
sessionContext.httpResponse = httpResponse
for w in parseWarnings for w in parseWarnings
w.sessionContext = sessionContext w.sessionContext = sessionContext
w.rpc = rpc; w.rpc = rpc;
@@ -872,16 +869,19 @@ listener = (httpRequest, httpResponse) ->
getSession(httpRequest.connection, sessionId, (err, sessionContext) -> getSession(httpRequest.connection, sessionId, (err, sessionContext) ->
return throwError(err, httpResponse) if err return throwError(err, httpResponse) if err
if sessionContext and (sessionContext.sessionId != sessionId or if sessionContext
sessionContext.lastActivity + sessionContext.timeout * 1000 < Date.now()) sessionContext.httpRequest = httpRequest
sessionContext.httpResponse = httpResponse
if sessionContext.sessionId != sessionId or
sessionContext.lastActivity + sessionContext.timeout * 1000 < Date.now()
logger.accessError({message: 'Invalid session', sessionContext: sessionContext}) logger.accessError({message: 'Invalid session', sessionContext: sessionContext})
httpResponse.writeHead(400, {'Connection': 'close'}) httpResponse.writeHead(400, {'Connection': 'close'})
httpResponse.end('Invalid session') httpResponse.end('Invalid session')
stats.concurrentRequests -= 1 stats.concurrentRequests -= 1
return return
else if stats.concurrentRequests > MAX_CONCURRENT_REQUESTS
# Check again just in case device included old session ID from the previous session # Check again just in case device included old session ID from the previous session
if not sessionContext and stats.concurrentRequests > MAX_CONCURRENT_REQUESTS
httpResponse.writeHead(503, {'Retry-after': 60, 'Connection': 'close'}) httpResponse.writeHead(503, {'Retry-after': 60, 'Connection': 'close'})
httpResponse.end('503 Service Unavailable') httpResponse.end('503 Service Unavailable')
stats.droppedRequests += 1 stats.droppedRequests += 1
@@ -892,14 +892,11 @@ listener = (httpRequest, httpResponse) ->
try try
rpc = soap.request(body, sessionContext?.cwmpVersion, parseWarnings) rpc = soap.request(body, sessionContext?.cwmpVersion, parseWarnings)
catch err catch err
msg = { logger.accessError({
message: 'XML parse error' message: 'XML parse error'
parseError: err.message.trim() parseError: err.message.trim()
sessionContext: sessionContext or {} sessionContext: sessionContext or {httpRequest: httpRequest, httpResponse: httpResponse}
} })
msg.sessionContext.httpRequest = httpRequest
msg.sessionContext.httpResponse = httpResponse
logger.accessError(msg)
httpResponse.writeHead(400, {'Connection': 'close'}) httpResponse.writeHead(400, {'Connection': 'close'})
httpResponse.end(err.message) httpResponse.end(err.message)
stats.concurrentRequests -= 1 stats.concurrentRequests -= 1
@@ -908,13 +905,10 @@ listener = (httpRequest, httpResponse) ->
return parsedRpc(sessionContext, rpc, parseWarnings) if sessionContext return parsedRpc(sessionContext, rpc, parseWarnings) if sessionContext
if rpc.cpeRequest?.name isnt 'Inform' if rpc.cpeRequest?.name isnt 'Inform'
msg = { logger.accessError({
message: 'Invalid session' message: 'Invalid session'
sessionContext: sessionContext or {} sessionContext: sessionContext or {httpRequest: httpRequest, httpResponse: httpResponse}
} })
msg.sessionContext.httpRequest = httpRequest
msg.sessionContext.httpResponse = httpResponse
logger.accessError(msg)
httpResponse.writeHead(400, {'Connection': 'close'}) httpResponse.writeHead(400, {'Connection': 'close'})
httpResponse.end('Invalid session') httpResponse.end('Invalid session')
stats.concurrentRequests -= 1 stats.concurrentRequests -= 1
@@ -925,6 +919,8 @@ listener = (httpRequest, httpResponse) ->
return session.init(deviceId, rpc.cwmpVersion, rpc.sessionTimeout ? config.get('SESSION_TIMEOUT', deviceId), (err, sessionContext) -> return session.init(deviceId, rpc.cwmpVersion, rpc.sessionTimeout ? config.get('SESSION_TIMEOUT', deviceId), (err, sessionContext) ->
return throwError(err, httpResponse) if err return throwError(err, httpResponse) if err
sessionContext.httpRequest = httpRequest
sessionContext.httpResponse = httpResponse
sessionContext.sessionId = crypto.randomBytes(8).toString('hex') sessionContext.sessionId = crypto.randomBytes(8).toString('hex')
httpRequest.connection.setTimeout(sessionContext.timeout * 1000) httpRequest.connection.setTimeout(sessionContext.timeout * 1000)