alongquan
alongquan

Reputation: 151

NodeJS - How to Download file via Request?

I have a ExternalServe (running on Localhost) When I using Browser to request:

localhost:2013/ExternalServer/getfilebyname?filename=getStatus.json

Then browser downloaded getStatus.json to Download Folder.

In my NodeJS project, I want to download getStatus.json file and I made:

download.js

var http = require('http');
var fs = require('fs');

function getFile (){

  var file = fs.createWriteStream("./../lib/user.json");
  var req = http.get("http://localhost:2013/ExternalServer/getfilebyname?filename=getStatus.json", function(res) {
    res.pipe(file);
});
}

getFile();

but when i run: node download.js the system return

<html><head><title>Apache Tomcat/8.0.0-RC1 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 401 - </h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>This request requires HTTP authentication.</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/8.0.0-RC1</h3></body></html>

How to fix it?

Best regard

Upvotes: 6

Views: 23070

Answers (2)

Ahsan Mahboob Shah
Ahsan Mahboob Shah

Reputation: 4029

You are getting the following error response:

This request requires HTTP authentication

Suggesting to add the Authorization information in header. Like:

var options = {
    host: 'localhost',
    port: 2013,
    path: '/ExternalServer/getfilebyname?filename=getStatus.json',
    headers: {
     'Authorization': 'Basic ' + new Buffer(uname + ':' + pword).toString('base64')
   }         
};

request = http.get(options, function(res) {
   res.pipe(file);
});

in case of proxy, you can use the following header instead:

Proxy-Authorization

Upvotes: 7

Paul
Paul

Reputation: 27483

The server wants a username and password, or requires another authorization mechanism, before it will let you access the file this way.

To see how to supply a user and password when making the request in node.js, look at How to use http.client in Node.js if there is basic authorization

How do we know this could be the problem?

Two interesting strings in the system return:

HTTP Status 401

and

This request requires HTTP authentication

From Wikipedia: List of HTTP Status Codes

401 Unauthorized Similar to 403 Forbidden, but specifically for use when authentication is required and has failed or has not yet been provided.[2] The response must include a WWW-Authenticate header field containing a challenge applicable to the requested resource. See Basic access authentication and Digest access authentication.

Another possibility is that a server could be set up to emit 401 instead of 403, but doesn't really accept any usernames or passwords.

Upvotes: 0

Related Questions