Permalink
Browse files

http.request(url.parse(x))

http2.js

protocols object to store defaults for http and https, and use as a switch for supported protocols.
options.hostname > options.host > 'localhost'
if I have an options.auth element and I do not have an Authorization header, I do basic auth.
http.request collapses to new ClientRequest since the defaults are handled by the protocol object

test-http-url.parse*

Fixes #1390

Conflicts:

	lib/http2.js
  • Loading branch information...
1 parent be4576d commit 005d607aedf57eac046834060f3f6e8f24817407 @seebees seebees committed with koichik Oct 15, 2011
View
@@ -980,14 +980,15 @@ Agent.prototype.removeSocket = function(s, name, host, port) {
var globalAgent = new Agent();
exports.globalAgent = globalAgent;
+
function ClientRequest(options, cb) {
var self = this;
OutgoingMessage.call(self);
self.agent = options.agent;
options.defaultPort = options.defaultPort || 80;
options.port = options.port || options.defaultPort;
- options.host = options.host || 'localhost';
+ options.host = options.hostname || options.host || 'localhost';
if (options.setHost === undefined) {
options.setHost = true;
@@ -1018,6 +1019,12 @@ function ClientRequest(options, cb) {
}
}
+ if (options.auth && !this.getHeader('Authorization')) {
+ //basic auth
+ this.setHeader('Authorization', 'Basic ' +
+ new Buffer(options.auth).toString('base64'));
+ }
+
if (method === 'GET' || method === 'HEAD') {
self.useChunkedEncodingByDefault = false;
} else {
@@ -1276,10 +1283,14 @@ ClientRequest.prototype.pause = function() {
exports.request = function(options, cb) {
+ if (options.protocol && options.protocol !== 'http:') {
+ throw new Error('Protocol:' + options.protocol + ' not supported.');
+ }
+
if (options.agent === undefined) {
options.agent = globalAgent;
}
- options.defaultPort = options.defaultPort || 80;
+
return new ClientRequest(options, cb);
};
View
@@ -68,12 +68,16 @@ exports.globalAgent = globalAgent;
exports.Agent = Agent;
exports.request = function(options, cb) {
+ if (options.protocol && options.protocol !== 'https:') {
+ throw new Error('Protocol:' + options.protocol + ' not supported.');
+ }
+
if (options.agent === undefined) {
options.agent = globalAgent;
}
options.createConnection = createConnection;
options.defaultPort = options.defaultPort || 443;
- return http.request(options, cb);
+ return new http.ClientRequest(options, cb);
};
exports.get = function(options, cb) {
@@ -0,0 +1,51 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var common = require('../common');
+var assert = require('assert');
+var http = require('http');
+var https = require('https');
+var url = require('url');
+
+var testURL = url.parse('http://asdf:qwer@localhost:' + common.PORT);
+// the test here is if you set a specific authorization header in the
+// request we should not override that with basic auth
+testURL.headers = {
+ Authorization: 'NoAuthForYOU'
+};
+
+function check(request) {
+ // the correct authorization header is be passed
+ assert.strictEqual(request.headers.authorization, 'NoAuthForYOU');
+}
+
+var server = http.createServer(function(request, response) {
+ // run the check function
+ check.call(this, request, response);
+ response.writeHead(200, {});
+ response.end('ok');
+ server.close();
+});
+
+server.listen(common.PORT, function () {
+ // make the request
+ http.request(testURL).end();
+});
@@ -0,0 +1,46 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var common = require('../common');
+var assert = require('assert');
+var http = require('http');
+var https = require('https');
+var url = require('url');
+
+var testURL = url.parse('http://asdf:qwer@localhost:' + common.PORT);
+
+function check(request) {
+ // the correct authorization header is be passed
+ assert.strictEqual(request.headers.authorization, 'Basic YXNkZjpxd2Vy');
+}
+
+var server = http.createServer(function(request, response) {
+ // run the check function
+ check.call(this, request, response);
+ response.writeHead(200, {});
+ response.end('ok');
+ server.close();
+});
+
+server.listen(common.PORT, function () {
+ // make the request
+ http.request(testURL).end();
+});
@@ -0,0 +1,55 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var common = require('../common');
+var assert = require('assert');
+var http = require('http');
+var url = require('url');
+
+var testURL = url.parse('http://localhost:' + common.PORT);
+
+// make sure the basics work
+function check(request) {
+ // default method should still be get
+ assert.strictEqual(request.method, 'GET');
+ // there are no URL params, so you should not see any
+ assert.strictEqual(request.url, '/');
+ // the host header should use the url.parse.hostname
+ assert.strictEqual(request.headers.host,
+ testURL.hostname + ':' + testURL.port);
+}
+
+var server = http.createServer(function(request, response) {
+ // run the check function
+ check.call(this, request, response);
+ response.writeHead(200, {});
+ response.end('ok');
+ server.close();
+});
+
+server.listen(common.PORT, function() {
+ // make the request
+ var clientRequest = http.request(testURL);
+ // since there is a little magic with the agent
+ // make sure that an http request uses the http.Agent
+ assert.ok(clientRequest.agent instanceof http.Agent);
+ clientRequest.end();
+});
@@ -0,0 +1,57 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var common = require('../common');
+var assert = require('assert');
+var https = require('https');
+var url = require('url');
+var fs = require('fs');
+var clientRequest;
+
+// https options
+var httpsOptions = {
+ key: fs.readFileSync(common.fixturesDir + '/keys/agent1-key.pem'),
+ cert: fs.readFileSync(common.fixturesDir + '/keys/agent1-cert.pem')
+};
+
+var testURL = url.parse('https://localhost:' + common.PORT);
+
+function check(request) {
+ // assert that I'm https
+ assert.ok(request.socket.encrypted);
+}
+
+var server = https.createServer(httpsOptions, function(request, response) {
+ // run the check function
+ check.call(this, request, response);
+ response.writeHead(200, {});
+ response.end('ok');
+ server.close();
+});
+
+server.listen(common.PORT, function () {
+ // make the request
+ var clientRequest = https.request(testURL);
+ // since there is a little magic with the agent
+ // make sure that the request uses the https.Agent
+ assert.ok(clientRequest.agent instanceof https.Agent);
+ clientRequest.end();
+});
@@ -0,0 +1,82 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var common = require('../common');
+var assert = require('assert');
+var http = require('http');
+var url = require('url');
+
+
+assert.throws(function() {
+ http.request(url.parse('file:///whatever'));
+}, function(err) {
+ if (err instanceof Error) {
+ assert.strictEqual(err.message, 'Protocol:file: not supported.');
+ return true;
+ }
+});
+
+assert.throws(function() {
+ http.request(url.parse('mailto:asdf@asdf.com'));
+}, function(err) {
+ if (err instanceof Error) {
+ assert.strictEqual(err.message, 'Protocol:mailto: not supported.');
+ return true;
+ }
+});
+
+assert.throws(function() {
+ http.request(url.parse('ftp://www.example.com'));
+}, function(err) {
+ if (err instanceof Error) {
+ assert.strictEqual(err.message, 'Protocol:ftp: not supported.');
+ return true;
+ }
+});
+
+assert.throws(function() {
+ http.request(url.parse('javascript:alert(\'hello\');'));
+}, function(err) {
+ if (err instanceof Error) {
+ assert.strictEqual(err.message, 'Protocol:javascript: not supported.');
+ return true;
+ }
+});
+
+assert.throws(function() {
+ http.request(url.parse('xmpp:isaacschlueter@jabber.org'));
+}, function(err) {
+ if (err instanceof Error) {
+ assert.strictEqual(err.message, 'Protocol:xmpp: not supported.');
+ return true;
+ }
+});
+
+assert.throws(function() {
+ http.request(url.parse('f://some.host/path'));
+}, function(err) {
+ if (err instanceof Error) {
+ assert.strictEqual(err.message, 'Protocol:f: not supported.');
+ return true;
+ }
+});
+
+//TODO do I need to test url.parse(notPrococol.example.com)?
Oops, something went wrong.

0 comments on commit 005d607

Please sign in to comment.