You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

89 lines
3.2 KiB

// Copyright 2014 Selenium committers
// Copyright 2014 Software Freedom Conservancy
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
var assert = require('assert');
var HttpClient = require('../../http').HttpClient;
var HttpRequest = require('../../_base').require('webdriver.http.Request');
var Server = require('../../lib/test/httpserver').Server;
var promise = require('../..').promise;
var test = require('../../lib/test');
describe('HttpClient', function() {
var server = new Server(function(req, res) {
if (req.method == 'GET' && req.url == '/echo') {
res.writeHead(200, req.headers);
res.end();
} else if (req.method == 'GET' && req.url == '/redirect') {
res.writeHead(303, {'Location': server.url('/hello')});
res.end();
} else if (req.method == 'GET' && req.url == '/hello') {
res.writeHead(200, {'content-type': 'text/plain'});
res.end('hello, world!');
} else if (req.method == 'GET' && req.url == '/badredirect') {
res.writeHead(303, {});
res.end();
} else {
res.writeHead(404, {});
res.end();
}
});
test.before(server.start.bind(server));
test.after(server.stop.bind(server));
test.it('can send a basic HTTP request', function() {
var request = new HttpRequest('GET', '/echo');
request.headers['Foo'] = 'Bar';
var client = new HttpClient(server.url());
return promise.checkedNodeCall(client.send.bind(client, request))
.then(function(response) {
assert.equal(200, response.status);
assert.equal(
'application/json; charset=utf-8', response.headers['accept']);
assert.equal('Bar', response.headers['foo']);
assert.equal('0', response.headers['content-length']);
assert.equal('keep-alive', response.headers['connection']);
assert.equal(server.host(), response.headers['host']);
});
});
test.it('automatically follows redirects', function() {
var request = new HttpRequest('GET', '/redirect');
var client = new HttpClient(server.url());
return promise.checkedNodeCall(client.send.bind(client, request))
.then(function(response) {
assert.equal(200, response.status);
assert.equal('text/plain', response.headers['content-type']);
assert.equal('hello, world!', response.body);
});
});
test.it('handles malformed redirect responses', function() {
var request = new HttpRequest('GET', '/badredirect');
var client = new HttpClient(server.url());
return promise.checkedNodeCall(client.send.bind(client, request)).
thenCatch(function(err) {
assert.ok(/Failed to parse "Location"/.test(err.message),
'Not the expected error: ' + err.message);
});
});
});