Dmitriy
Dmitriy

Reputation: 703

"Socket hang up" error during request

I try to make a GET request to some site (not mine own site) via http module of node.js version 0.8.14. Here is my code (CoffeeScript):

options = 
        host: 'www.ya.ru'
        method: 'GET'
    req = http.request options, (res) ->
        output = ''
        console.log 'STATUS: ' + res.statusCode
        res.on 'data', (chunk) ->
            console.log 'A new chunk: ', chunk
            output += chunk

        res.on 'end', () ->
            console.log output
            console.log 'End GET Request'

    req.on 'error', (err) ->
        console.log 'Error: ', err
    req.end()

I get the following error during this operation: { [Error: socket hang up] code: 'ECONNRESET' }. If I comment the error handler my application is finished with the following error:

events.js:48
    throw arguments[1]; // Unhandled 'error' event
    ^
Error: socket hang up
    at createHangUpError (http.js:1091:15)
    at Socket.onend (http.js:1154:27)
    at TCP.onread (net.js:363:26)

I try to find out solution on the internet but still hasn't found them. How to solve this issue?

Upvotes: 24

Views: 85696

Answers (7)

LeOn - Han Li
LeOn - Han Li

Reputation: 10234

In my case, after upgrading to node 8.0.0, the post does not work anymore. adding Content-Length to header does not help. Have to add 'Connection': 'keep-alive' to the header instead to get this error away.

    let postOptions = {
        method: 'POST',
        form: form,
        url: finalUrl,
        followRedirect: false,
        headers:{
            'Connection': 'keep-alive'
        }
    };
    request(postOptions, handleSAMLResponse);

Upvotes: 0

Aviram Netanel
Aviram Netanel

Reputation: 13675

in my case it was the 'Content-Length' header - I took it out and it's fine now...

code:

function sendRequest(data)
{
    var options = {
              hostname: host,
              path: reqPath,
              port: port,
              method: method,
              headers: {
                      'Content-Length': '100'
              }
    var req = http.request(options, callback);
    req.end();
    };

after removing the line: 'Content-Length': '100' it sorted out.

Upvotes: 10

Sushil
Sushil

Reputation: 5545

When upgrading from 0.10.33 to 0.12 of nodejs, this error was hit.

In my case, there was a body (json) for the delete request. Earlier, node client was setting - 'transfer-encoding' as chunked - by default when 'content-length' is not set. It seems in recent version - node client stopped setting transfer-encoding by default.

Fix was to set it in the request.

Upvotes: 0

Rajat Talwar
Rajat Talwar

Reputation: 11912

I found this to occur in one more case where I was sending empty body like - '{}' in a delete operation called from intern framework for testing; instead I used null to send as value of body parameter while making the request through

Upvotes: 1

Dmitriy
Dmitriy

Reputation: 703

I've finally detected the problem and found out the solution. The problem was that I use a proxy server to connect to the internet. Here is the working code:

options = 
    hostname: 'myproxy.ru'
    path: 'http://www.ya.ru'
    port: 3128
    headers: {
        Host: "www.ya.ru"
    }
req = http.request options, (res) ->
    output = ''
    console.log 'STATUS: ' + res.statusCode
    res.on 'data', (chunk) ->
        console.log 'A new chunk: ', chunk
        output += chunk

    res.on 'end', () ->
        console.log output
        console.log 'End GET Request'

req.on 'error', (err) ->
    console.log 'Error: ', err
req.end()

Thank you all for helps and suggestions!

Upvotes: 6

Jonathan Lonowski
Jonathan Lonowski

Reputation: 123563

When using http.request(), you have to at some point call request.end().

req = http.request options, (res) ->
    # ...

req.on 'error', # ...

req.end() # <---

Until then, the request is left open to allow for writing a body. And, the error is because the server will eventually consider the connection to have timed out and will close it.

Alternatively, you can also use http.get() with GET requests, which will call .end() automatically since GET requests aren't normally expected to have a body.

Upvotes: 19

user568109
user568109

Reputation: 48013

You have to end the request. Add this at the end of your script:

req.end()

Upvotes: 36

Related Questions