http: make http.get() accept a URL
authorAdam Malcontenti-Wilson <adman.com@gmail.com>
Wed, 16 May 2012 14:27:34 +0000 (16:27 +0200)
committerBen Noordhuis <info@bnoordhuis.nl>
Wed, 16 May 2012 14:43:18 +0000 (16:43 +0200)
http.get() now accepts either a URL (as a string) or an options object.

doc/api/http.markdown
lib/http.js
test/simple/test-http-client-get-url.js [new file with mode: 0644]

index d064b3f29dc5e4dc5477e0ba309b2f966f647f0b..962aa49081f5a18db4f665d418ecf8f2dca38b76 100644 (file)
@@ -446,8 +446,10 @@ followed by `response.end()`.
 ## http.request(options, callback)
 
 Node maintains several connections per server to make HTTP requests.
-This function allows one to transparently issue requests.  `options` align
-with [url.parse()](url.html#url.parse).
+This function allows one to transparently issue requests.
+
+`options` can be an object or a string. If `options` is a string, it is
+automatically parsed with [url.parse()](url.html#url.parse).
 
 Options:
 
@@ -528,18 +530,12 @@ There are a few special headers that should be noted.
 ## http.get(options, callback)
 
 Since most requests are GET requests without bodies, Node provides this
-convenience method. The only difference between this method and `http.request()` is
-that it sets the method to GET and calls `req.end()` automatically.
+convenience method. The only difference between this method and `http.request()`
+is that it sets the method to GET and calls `req.end()` automatically.
 
 Example:
 
-    var options = {
-      host: 'www.google.com',
-      port: 80,
-      path: '/index.html'
-    };
-
-    http.get(options, function(res) {
+    http.get("http://www.google.com/index.html", function(res) {
       console.log("Got response: " + res.statusCode);
     }).on('error', function(e) {
       console.log("Got error: " + e.message);
index 232d52afe0ba250e0ad92cf29c353826ab6dfd11..a98a3104cde242f35ec72d99b50c0e43b9e5d7e6 100644 (file)
@@ -22,6 +22,7 @@
 var util = require('util');
 var net = require('net');
 var stream = require('stream');
+var url = require('url');
 var EventEmitter = require('events').EventEmitter;
 var FreeList = require('freelist').FreeList;
 var HTTPParser = process.binding('http_parser').HTTPParser;
@@ -1571,6 +1572,10 @@ ClientRequest.prototype.clearTimeout = function(cb) {
 };
 
 exports.request = function(options, cb) {
+  if (typeof options === 'string') {
+    options = url.parse(options);
+  }
+
   if (options.protocol && options.protocol !== 'http:') {
     throw new Error('Protocol:' + options.protocol + ' not supported.');
   }
diff --git a/test/simple/test-http-client-get-url.js b/test/simple/test-http-client-get-url.js
new file mode 100644 (file)
index 0000000..451f5ee
--- /dev/null
@@ -0,0 +1,44 @@
+// 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 seen_req = false;
+
+var server = http.createServer(function(req, res) {
+  assert.equal('GET', req.method);
+  assert.equal('/foo?bar', req.url);
+  res.writeHead(200, {'Content-Type': 'text/plain'});
+  res.write('hello\n');
+  res.end();
+  server.close();
+  seen_req = true;
+});
+
+server.listen(common.PORT, function() {
+  http.get('http://127.0.0.1:' + common.PORT + '/foo?bar');
+});
+
+process.on('exit', function() {
+  assert(seen_req);
+});