http-party / node-http-proxy

A full-featured http proxy for node.js
https://github.com/http-party/node-http-proxy
Other
13.91k stars 1.97k forks source link

Constantly refreshing error #909

Open mario-mui opened 8 years ago

mario-mui commented 8 years ago

Due to using node-http-proxy in the website, when I refresh a certain page constantly, a error came up as follows:

Proxy error in Kibana { [Error: socket hang up] code: 'ECONNRESET' }
Proxy error in Kibana { [Error: socket hang up] code: 'ECONNRESET' }
http_outgoing.js:335
throw new Error('Can\'t set headers after they are sent.');
          ^
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:335:11)
at ServerResponse.res.setHeader (/server/pbe-reborn/node_modules/sails/node_modules/connect/lib/patch.js:133:22)
at ServerResponse.res.set.res.header (/server/pbe-reborn/node_modules/sails/node_modules/express/lib/response.js:577:10)
at ServerResponse.res.location (/server/pbe-reborn/node_modules/sails/node_modules/express/lib/response.js:707:8)
at ServerResponse.res.redirect (/server/pbe-reborn/node_modules/sails/node_modules/express/lib/response.js:746:8)
at ProxyServer.<anonymous> (/server/pbe-reborn/config/http.coffee:45:26)
 at ProxyServer.emit (/server/pbe-reborn/node_modules/http-proxy/node_modules/eventemitter3/index.js:117:27)
 at ClientRequest.proxyError (/server/pbe-reborn/node_modules/http-proxy/lib/http-proxy/passes/web-incoming.js:140:16)
at emitOne (events.js:82:20)
 ClientRequest.emit (events.js:169:7)
 Socket.socketCloseListener (_http_client.js:235:9)
emitOne (events.js:82:20)
 Socket.emit (events.js:169:7)
TCP._onclose (net.js:468:12)

Using http-proxy in my code as follow:


kibana: (req, res, next) ->
      if req.url.startsWith('/kibana')
        if req.session?.passport?.user
          if req.url is '/kibana'
            return res.redirect(req.url + '/')
          else
            req.url = req.url.replace(/^\/kibana/, "")
            proxy.web(req, res, {
              target: 'http://kibana:5601/'
            })
            proxy.on('error', (err, req, res) ->
              console.log('Proxy error in Kibana', err)
              return res.redirect('/404')
            )
        else
          req.session.returnTo = '/kibana/'
          return res.redirect('/login')
      else
        next()
jcrugzz commented 8 years ago

@mario56 please see here for an example of how to prevent this. You cannot assume you can run res.redirect for every error that occurs because headers from the server you a proxying to may have been sent already.