#!/usr/bin/env ruby
# -*- coding: binary -*-

$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))

require 'test/unit'
require 'rex/proto/http'

class Rex::Proto::Http::Client::UnitTest < Test::Unit::TestCase

	Klass = Rex::Proto::Http::Client

	def test_parse
		c = Klass.new('www.metasploit.com')

		# Set request factory parameters
		c.set_config(
			'vhost'      => 'www.metasploit.com',
			'agent'      => 'Metasploit Framework/3.3',
			'version'    => '1.1',
			'cookie'     => 'NoCookie=NotACookie'
		)

		# Set client parameters
		c.set_config(
			'read_max_data' => 1024 * 1024
		)

		#
		# Request the main web page
		#
		r = c.request_raw(
			'method' => 'GET',
			'uri'    => '/'
		)

		resp = c.send_recv(r)

		assert_equal(200, resp.code)
		assert_equal('OK', resp.message)
		assert_equal('1.1', resp.proto)

		#
		# Request a file that does not exist
		#
		r = c.request_raw(
			'method' => 'GET',
			'uri'    => '/NoFileHere.404'
		)

		resp = c.send_recv(r)

		assert_equal(404, resp.code)
		assert_equal('Not Found', resp.message)
		assert_equal('1.1', resp.proto)


		#
		# Send a POST request that results in a 302
		#
		c = Klass.new('beta.microsoft.com')
		c.set_config('vhost' => 'beta.microsoft.com')

		r = c.request_cgi(
			'method' => 'POST',
			'uri'    => '/',
			'vars_post'  => { 'var' => 'val' },
			'ctype' => 'application/x-www-form-urlencoded'
		)

		resp = c.send_recv(r)

		#assert_equal(200, resp.code)
		#assert_equal('OK', resp.message)
		assert_equal(301, resp.code)
		assert_equal('Moved Permanently', resp.message)
		assert_equal('1.1', resp.proto)
	end

	def test_ssl
		c = Klass.new('www.metasploit.com', 443, {}, true)
		c.set_config('vhost' => 'www.metasploit.com')
		r = c.request_raw(
			'method' => 'GET',
			'uri'    => '/'
		)
		resp = c.send_recv(r)

		assert_equal(200, resp.code)
		assert_equal('OK', resp.message)
		assert_equal('1.0', resp.proto)
		c.close
	end

end

