Reputation: 703
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
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
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
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
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
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
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
Reputation: 48013
You have to end the request. Add this at the end of your script:
req.end()
Upvotes: 36