mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* ext/openssl: imported.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4128 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									fd46a1da0a
								
							
						
					
					
						commit
						231247c010
					
				
					 63 changed files with 12561 additions and 0 deletions
				
			
		
							
								
								
									
										179
									
								
								ext/openssl/lib/net/https.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										179
									
								
								ext/openssl/lib/net/https.rb
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,179 @@ | |||
| =begin | ||||
| = $RCSfile$ -- SSL/TLS enhancement for Net::HTTP. | ||||
| 
 | ||||
| = Info | ||||
|   'OpenSSL for Ruby 2' project | ||||
|   Copyright (C) 2001 GOTOU Yuuzou <gotoyuzo@notwork.org> | ||||
|   All rights reserved. | ||||
| 
 | ||||
| = Licence | ||||
|   This program is licenced under the same licence as Ruby. | ||||
|   (See the file 'LICENCE'.) | ||||
| 
 | ||||
| = Requirements | ||||
|   This program requires Net 1.2.0 or higher version. | ||||
|   You can get it from RAA or Ruby's CVS repository. | ||||
| 
 | ||||
| = Version | ||||
|   $Id$ | ||||
|    | ||||
|   2001/11/06: Contiributed to Ruby/OpenSSL project. | ||||
| 
 | ||||
| == class Net::HTTP | ||||
| 
 | ||||
| == Example | ||||
| 
 | ||||
| Simple HTTP client is here: | ||||
| 
 | ||||
|     require 'net/http' | ||||
|     host, port, path = "localhost", 80, "/" | ||||
|     if %r!http://(.*?)(?::(\d+))?(/.*)! =~ ARGV[0] | ||||
|       host   = $1 | ||||
|       port   = $2.to_i if $2 | ||||
|       path   = $3 | ||||
|     end | ||||
|     h = Net::HTTP.new(host, port) | ||||
|     h.get2(path){ |resp| print resp.body } | ||||
| 
 | ||||
| It can be replaced by follow one: | ||||
| 
 | ||||
|     require 'net/https' | ||||
|     host, port, path = "localhost", 80, "/" | ||||
|     if %r!(https?)://(.*?)(?::(\d+))?(/.*)! =~ ARGV[0] | ||||
|       scheme = $1 | ||||
|       host   = $2 | ||||
|       port   = $3 ? $3.to_i : ((scheme == "http") ? 80 : 443) | ||||
|       path   = $4 | ||||
|     end | ||||
|     h = Net::HTTP.new(host, port) | ||||
|     h.use_ssl = true if scheme == "https" # enable SSL/TLS | ||||
|     h.get2(path){ |resp| print resp.body } | ||||
| 
 | ||||
| === Instance Methods | ||||
| 
 | ||||
| : use_ssl | ||||
|     returns ture if use SSL/TLS with HTTP. | ||||
| 
 | ||||
| : use_ssl=((|true_or_false|)) | ||||
|     sets use_ssl. | ||||
| 
 | ||||
| : peer_cert | ||||
|     return the X.509 certificates the server presented. | ||||
| 
 | ||||
| : key=((|key|)) | ||||
|     Sets an OpenSSL::PKey::RSA or OpenSSL::PKey::DSA object. | ||||
|     (This method is appeared in Michal Rokos's OpenSSL extention.) | ||||
| 
 | ||||
| : key_file=((|path|)) | ||||
|     Sets a private key file to use in PEM format. | ||||
| 
 | ||||
| : cert=((|cert|)) | ||||
|     Sets an OpenSSL::X509::Certificate object as client certificate. | ||||
|     (This method is appeared in Michal Rokos's OpenSSL extention.) | ||||
| 
 | ||||
| : cert_file=((|path|)) | ||||
|     Sets pathname of a X.509 certification file in PEM format. | ||||
| 
 | ||||
| : ca_file=((|path|)) | ||||
|     Sets path of a CA certification file in PEM format. | ||||
|     The file can contrain several CA certificats. | ||||
| 
 | ||||
| : ca_path=((|path|)) | ||||
|     Sets path of a CA certification directory containing certifications | ||||
|     in PEM format. | ||||
| 
 | ||||
| : verify_mode=((|mode|)) | ||||
|     Sets the flags for server the certification verification at | ||||
|     begining of SSL/TLS session. | ||||
|     OpenSSL::SSL::VERIFY_NONE or OpenSSL::SSL::VERIFY_PEER is acceptable. | ||||
| 
 | ||||
| : verify_callback=((|proc|)) | ||||
|     Sets the verify callback for the server certification verification. | ||||
| 
 | ||||
| : verify_depth=((|num|)) | ||||
|     Sets the maximum depth for the certificate chain verification. | ||||
| 
 | ||||
| : cert_store=((|store|)) | ||||
|     Sets the X509::Store to verify peer certificate. | ||||
| 
 | ||||
| =end | ||||
| 
 | ||||
| require 'net/protocols' | ||||
| require 'net/http' | ||||
| 
 | ||||
| module Net | ||||
|   class HTTP | ||||
|     class Conn < HTTPRequest | ||||
|       REQUEST_HAS_BODY=false | ||||
|       RESPONSE_HAS_BODY=false | ||||
|       METHOD="connect" | ||||
| 
 | ||||
|       def initialize | ||||
|         super nil, nil | ||||
|       end | ||||
| 
 | ||||
|       def exec( sock, addr, port, ver ) | ||||
|         @socket = sock | ||||
|         request(addr, port, ver) | ||||
|       end | ||||
| 
 | ||||
|       def request( addr, port, ver ) | ||||
|         @socket.writeline sprintf('CONNECT %s:%s HTTP/%s', addr, port, ver) | ||||
|         @socket.writeline '' | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     module ProxyMod | ||||
|       def edit_path( path ) | ||||
|         if use_ssl | ||||
|           'https://' + addr_port + path | ||||
|         else | ||||
|           'http://' + addr_port + path | ||||
|         end | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     def self.socket_type | ||||
|       SSLIO | ||||
|     end | ||||
| 
 | ||||
|     attr_accessor :use_ssl | ||||
|     attr_writer :key, :cert | ||||
|     attr_writer :ca_file, :ca_path | ||||
|     attr_writer :verify_mode, :verify_callback, :verify_depth | ||||
|     attr_writer :cert_store, :timeout | ||||
|     attr_reader :peer_cert | ||||
| 
 | ||||
|     alias :default_initialize :initialize | ||||
| 
 | ||||
|     def initialize(*args) | ||||
|       default_initialize(*args) | ||||
|       @key = @cert = @ca_file = @ca_path = @verify_mode = | ||||
|       @verify_callback = @verify_depth = @timeout = @cert_store = nil | ||||
|     end | ||||
| 
 | ||||
|     def on_connect | ||||
|       if use_ssl | ||||
|         if proxy? | ||||
|           Conn.new.exec(@socket, @address, @port, "1.0") | ||||
|           resp = HTTPResponse.read_new(@socket) | ||||
|           if resp.code != '200' | ||||
|             raise resp.message | ||||
|           end | ||||
|         end | ||||
|         @socket.key             = @key       if @key | ||||
|         @socket.cert            = @cert      if @cert | ||||
|         @socket.ca_file         = @ca_file | ||||
|         @socket.ca_path         = @ca_path | ||||
|         @socket.verify_mode     = @verify_mode | ||||
|         @socket.verify_callback = @verify_callback | ||||
|         @socket.verify_depth    = @verify_depth | ||||
|         @socket.timeout         = @timeout | ||||
|         @socket.cert_store      = @cert_store | ||||
|         @socket.ssl_connect | ||||
|         @peer_cert = @socket.peer_cert | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|   end | ||||
| end | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 gotoyuzo
						gotoyuzo