mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	This commit was manufactured by cvs2svn to create branch 'ruby_1_8'.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@5406 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									c19b0b5692
								
							
						
					
					
						commit
						6467d1fd74
					
				
					 10 changed files with 516 additions and 0 deletions
				
			
		
							
								
								
									
										107
									
								
								lib/soap/attachment.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								lib/soap/attachment.rb
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,107 @@ | |||
| # soap/attachment.rb: SOAP4R - SwA implementation. | ||||
| # Copyright (C) 2002, 2003  Jamie Herre and NAKAMURA, Hiroshi <nahi@ruby-lang.org>. | ||||
| 
 | ||||
| # This program is copyrighted free software by NAKAMURA, Hiroshi.  You can | ||||
| # redistribute it and/or modify it under the same terms of Ruby's license; | ||||
| # either the dual license version in 2003, or any later version. | ||||
| 
 | ||||
| 
 | ||||
| require 'soap/baseData' | ||||
| require 'soap/mapping' | ||||
| 
 | ||||
| 
 | ||||
| module SOAP | ||||
| 
 | ||||
| 
 | ||||
| class SOAPAttachment < SOAPExternalReference | ||||
|   attr_reader :data | ||||
| 
 | ||||
|   def initialize(value) | ||||
|     super() | ||||
|     @data = value | ||||
|   end | ||||
| 
 | ||||
| private | ||||
| 
 | ||||
|   def external_contentid | ||||
|     @data.contentid | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| 
 | ||||
| class Attachment | ||||
|   attr_reader :io | ||||
|   attr_accessor :contenttype | ||||
| 
 | ||||
|   def initialize(string_or_readable = nil) | ||||
|     @string_or_readable = string_or_readable | ||||
|     @contenttype = "application/octet-stream" | ||||
|     @contentid = nil | ||||
|   end | ||||
| 
 | ||||
|   def contentid | ||||
|     @contentid ||= Attachment.contentid(self) | ||||
|   end | ||||
| 
 | ||||
|   def contentid=(contentid) | ||||
|     @contentid = contentid | ||||
|   end | ||||
| 
 | ||||
|   def mime_contentid | ||||
|     '<' + contentid + '>' | ||||
|   end | ||||
| 
 | ||||
|   def content | ||||
|     if @content == nil and @string_or_readable != nil | ||||
|       @content = @string_or_readable.respond_to?(:read) ? | ||||
| 	@string_or_readable.read : @string_or_readable | ||||
|     end | ||||
|     @content | ||||
|   end | ||||
| 
 | ||||
|   def to_s | ||||
|     content | ||||
|   end | ||||
| 
 | ||||
|   def write(out) | ||||
|     out.write(content) | ||||
|   end | ||||
| 
 | ||||
|   def save(filename) | ||||
|     File.open(filename, "wb") do |f| | ||||
|       write(f) | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   def self.contentid(obj) | ||||
|     # this needs to be fixed | ||||
|     [obj.__id__.to_s, Process.pid.to_s].join('.') | ||||
|   end | ||||
| 
 | ||||
|   def self.mime_contentid(obj) | ||||
|     '<' + contentid(obj) + '>' | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| 
 | ||||
| module Mapping | ||||
|   class AttachmentFactory < SOAP::Mapping::Factory | ||||
|     def obj2soap(soap_class, obj, info, map) | ||||
|       soap_obj = soap_class.new(obj) | ||||
|       mark_marshalled_obj(obj, soap_obj) | ||||
|       soap_obj | ||||
|     end | ||||
| 
 | ||||
|     def soap2obj(obj_class, node, info, map) | ||||
|       obj = node.data | ||||
|       mark_unmarshalled_obj(node, obj) | ||||
|       return true, obj | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   DefaultRegistry.add(::SOAP::Attachment, ::SOAP::SOAPAttachment, | ||||
|     AttachmentFactory.new, nil) | ||||
| end | ||||
| 
 | ||||
| 
 | ||||
| end | ||||
							
								
								
									
										238
									
								
								lib/soap/mimemessage.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										238
									
								
								lib/soap/mimemessage.rb
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,238 @@ | |||
| # SOAP4R - MIME Message implementation. | ||||
| # Copyright (C) 2002  Jamie Herre. | ||||
| 
 | ||||
| # This program is copyrighted free software by NAKAMURA, Hiroshi.  You can | ||||
| # redistribute it and/or modify it under the same terms of Ruby's license; | ||||
| # either the dual license version in 2003, or any later version. | ||||
| 
 | ||||
| 
 | ||||
| require 'soap/attachment' | ||||
| 
 | ||||
| 
 | ||||
| module SOAP | ||||
| 
 | ||||
| 
 | ||||
| # Classes for MIME message handling.  Should be put somewhere else! | ||||
| # Tried using the 'tmail' module but found that I needed something | ||||
| # lighter in weight. | ||||
| 
 | ||||
| 
 | ||||
| class MIMEMessage | ||||
|   class MIMEMessageError < StandardError; end | ||||
| 
 | ||||
|   MultipartContentType = 'multipart/\w+' | ||||
| 
 | ||||
|   class Header | ||||
|     attr_accessor :str, :key, :root | ||||
| 
 | ||||
|     def initialize | ||||
|       @attrs = {} | ||||
|     end | ||||
| 
 | ||||
|     def [](key) | ||||
|       @attrs[key] | ||||
|     end | ||||
| 
 | ||||
|     def []=(key, value) | ||||
|       @attrs[key] = value | ||||
|     end | ||||
| 
 | ||||
|     def to_s | ||||
|       @key + ": " + @str | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   class Headers < Hash | ||||
|     def self.parse(str) | ||||
|       new.parse(str) | ||||
|     end | ||||
| 
 | ||||
|     def parse(str) | ||||
|       header_cache = nil | ||||
|       str.each do |line| | ||||
| 	case line | ||||
| 	when /^\A[^\: \t]+:\s*.+$/ | ||||
| 	  parse_line(header_cache) if header_cache | ||||
| 	  header_cache = line.sub(/\r?\n\z/, '') | ||||
| 	when /^\A\s+(.*)$/ | ||||
| 	  # a continuous line at the beginning line crashes here. | ||||
| 	  header_cache << line | ||||
| 	else | ||||
| 	  raise RuntimeError.new("unexpected header: #{line.inspect}") | ||||
| 	end | ||||
|       end | ||||
|       parse_line(header_cache) if header_cache | ||||
|       self | ||||
|     end | ||||
| 
 | ||||
|     def parse_line(line) | ||||
|       if /^\A([^\: \t]+):\s*(.+)\z/ =~ line | ||||
|     	header = parse_rhs($2.strip) | ||||
| 	header.key = $1.strip | ||||
| 	self[header.key.downcase] = header | ||||
|       else | ||||
| 	raise RuntimeError.new("unexpected header line: #{line.inspect}") | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     def parse_rhs(str) | ||||
|       a = str.split(/;+\s+/) | ||||
|       header = Header.new | ||||
|       header.str = str | ||||
|       header.root = a.shift | ||||
|       a.each do |pair| | ||||
| 	if pair =~ /(\w+)\s*=\s*"?([^"]+)"?/ | ||||
| 	  header[$1.downcase] = $2 | ||||
| 	else | ||||
| 	  raise RuntimeError.new("unexpected header component: #{pair.inspect}") | ||||
| 	end | ||||
|       end | ||||
|       header | ||||
|     end | ||||
| 
 | ||||
|     def add(key, value) | ||||
|       if key != nil and value != nil | ||||
| 	header = parse_rhs(value) | ||||
| 	header.key = key | ||||
| 	self[key.downcase] = header | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     def to_s | ||||
|       self.values.collect { |hdr| | ||||
| 	hdr.to_s | ||||
|       }.join("\r\n") | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   class Part | ||||
|     attr_accessor :headers, :body | ||||
| 
 | ||||
|     def initialize | ||||
|       @headers = Headers.new | ||||
|       @headers.add("Content-Transfer-Encoding", "8bit") | ||||
|       @body = nil | ||||
|     end | ||||
| 
 | ||||
|     def self.parse(str) | ||||
|       new.parse(str) | ||||
|     end | ||||
| 
 | ||||
|     def parse(str) | ||||
|       headers, body = str.split(/\r\n\r\n/s) | ||||
|       if headers != nil and body != nil | ||||
| 	@headers = Headers.parse(headers) | ||||
| 	@body = body.sub(/\r\n\z/, '') | ||||
|       else | ||||
| 	raise RuntimeError.new("unexpected part: #{str.inspect}") | ||||
|       end | ||||
|       self | ||||
|     end | ||||
| 
 | ||||
|     def contentid | ||||
|       if @contentid == nil and @headers.key?('content-id') | ||||
| 	@contentid = @headers['content-id'].str | ||||
| 	@contentid = $1 if @contentid =~ /^<(.+)>$/ | ||||
|       end | ||||
|       @contentid | ||||
|     end | ||||
| 
 | ||||
|     alias content body | ||||
| 
 | ||||
|     def to_s | ||||
|       @headers.to_s + "\r\n\r\n" + @body | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   def initialize | ||||
|     @parts = [] | ||||
|     @headers = Headers.new | ||||
|   end | ||||
| 
 | ||||
|   def self.parse(head, str) | ||||
|     new.parse(head, str) | ||||
|   end | ||||
| 
 | ||||
|   attr_reader :parts, :headers | ||||
| 
 | ||||
|   def close | ||||
|     @headers.add( | ||||
|       "Content-Type", | ||||
|       "multipart/related; type=\"text/xml\"; boundary=\"#{boundary}\"; start=\"#{@parts[0].contentid}\"" | ||||
|     ) | ||||
|   end | ||||
| 
 | ||||
|   def parse(head, str) | ||||
|     @headers = Headers.parse(head + "\r\n" + "From: jfh\r\n") | ||||
|     boundary = @headers['content-type']['boundary'] | ||||
|     if boundary != nil | ||||
|       parts = str.split(/--#{Regexp.quote(boundary)}\s*(?:\r\n|--\r\n)/) | ||||
|       part = parts.shift	# preamble must be ignored. | ||||
|       @parts = parts.collect { |part| Part.parse(part) } | ||||
|     else | ||||
|       @parts = [Part.parse(str)] | ||||
|     end | ||||
|     if @parts.length < 1 | ||||
|       raise MIMEMessageError.new("This message contains no valid parts!") | ||||
|     end | ||||
|     self | ||||
|   end | ||||
| 
 | ||||
|   def root | ||||
|     if @root == nil | ||||
|       start = @headers['content-type']['start'] | ||||
|       @root = (start && @parts.find { |prt| prt.contentid == start }) || | ||||
| 	@parts[0] | ||||
|     end | ||||
|     @root | ||||
|   end | ||||
| 
 | ||||
|   def boundary | ||||
|     if @boundary == nil | ||||
|       @boundary = "----=Part_" + __id__.to_s + rand.to_s | ||||
|     end | ||||
|     @boundary | ||||
|   end | ||||
| 
 | ||||
|   def add_part(content) | ||||
|     part = Part.new | ||||
|     part.headers.add("Content-Type", | ||||
|       "text/xml; charset=" + XSD::Charset.encoding_label) | ||||
|     part.headers.add("Content-ID", Attachment.contentid(part)) | ||||
|     part.body = content | ||||
|     @parts.unshift(part) | ||||
|   end | ||||
| 
 | ||||
|   def add_attachment(attach) | ||||
|     part = Part.new | ||||
|     part.headers.add("Content-Type", attach.contenttype) | ||||
|     part.headers.add("Content-ID", attach.mime_contentid) | ||||
|     part.body = attach.content | ||||
|     @parts.unshift(part) | ||||
|   end | ||||
| 
 | ||||
|   def has_parts? | ||||
|     (@parts.length > 0) | ||||
|   end | ||||
| 
 | ||||
|   def headers_str | ||||
|     @headers.to_s | ||||
|   end | ||||
| 
 | ||||
|   def content_str | ||||
|     str = '' | ||||
|     @parts.each do |prt| | ||||
|       str << "--" + boundary + "\r\n" | ||||
|       str << prt.to_s + "\r\n" | ||||
|     end | ||||
|     str << '--' + boundary + "--\r\n" | ||||
|     str | ||||
|   end | ||||
| 
 | ||||
|   def to_s | ||||
|     str = headers_str + "\r\n\r\n" + conent_str | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| 
 | ||||
| end | ||||
							
								
								
									
										66
									
								
								sample/webrick/demo-app.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								sample/webrick/demo-app.rb
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,66 @@ | |||
| require "pp" | ||||
| 
 | ||||
| module DemoApplication | ||||
|   def initialize(config, enctype) | ||||
|     super | ||||
|     @enctype = enctype | ||||
|   end | ||||
| 
 | ||||
|   def do_GET(req, res) | ||||
|     if req.path_info != "/" | ||||
|       res.set_redirect(WEBrick::HTTPStatus::Found, req.script_name + "/") | ||||
|     end | ||||
|     res.body =<<-_end_of_html_ | ||||
|       <HTML> | ||||
|        <FORM method="POST" enctype=#{@enctype}> | ||||
|         text: <INPUT type="text" name="text"><BR> | ||||
|         file: <INPUT type="file" name="file"><BR> | ||||
|         check: | ||||
|         <INPUT type="checkbox" name="check" value="a">a, | ||||
|         <INPUT type="checkbox" name="check" value="b">b, | ||||
|         <INPUT type="checkbox" name="check" value="c">c, | ||||
|         <BR> | ||||
|         <INPUT type="submit"> | ||||
|        </FORM> | ||||
|       </HTML> | ||||
|     _end_of_html_ | ||||
|     res['content-type'] = 'text/html; charset=iso-8859-1' | ||||
|   end | ||||
| 
 | ||||
|   def do_POST(req, res) | ||||
|     if req["content-length"].to_i > 1024*10 | ||||
|       raise WEBrick::HTTPStatus::Forbidden, "file size too large" | ||||
|     end | ||||
|     res.body =<<-_end_of_html_ | ||||
|       <HTML> | ||||
|        <H2>Query Parameters</H2> | ||||
|        #{display_query(req.query)} | ||||
|        <A href="#{req.path}">return</A> | ||||
|        <H2>Request</H2> | ||||
|        <PRE>#{WEBrick::HTMLUtils::escape(PP::pp(req, "", 80))}</PRE> | ||||
|        <H2>Response</H2> | ||||
|        <PRE>#{WEBrick::HTMLUtils::escape(PP::pp(res, "", 80))}</PRE> | ||||
|       </HTML> | ||||
|     _end_of_html_ | ||||
|     res['content-type'] = 'text/html; charset=iso-8859-1' | ||||
|   end | ||||
| 
 | ||||
|   private | ||||
| 
 | ||||
|   def display_query(q) | ||||
|     ret = "" | ||||
|     q.each{|key, val| | ||||
|       ret << "<H3>#{WEBrick::HTMLUtils::escape(key)}</H3>" | ||||
|       ret << "<TABLE border=1>" | ||||
|       ret << make_tr("val", val.inspect) | ||||
|       ret << make_tr("val.to_a", val.to_a.inspect) | ||||
|       ret << make_tr("val.to_ary", val.to_ary.inspect) | ||||
|       ret << "</TABLE>" | ||||
|     } | ||||
|     ret | ||||
|   end | ||||
| 
 | ||||
|   def make_tr(arg0, arg1) | ||||
|     "<TR><TD>#{arg0}</TD><TD>#{WEBrick::HTMLUtils::escape(arg1)}</TD></TR>" | ||||
|   end | ||||
| end | ||||
							
								
								
									
										12
									
								
								sample/webrick/demo-multipart.cgi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								sample/webrick/demo-multipart.cgi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | |||
| #!/usr/bin/env ruby | ||||
| require "webrick/cgi" | ||||
| require "webrick/https" # should load if it runs on HTTPS server | ||||
| require "./demo-app" | ||||
| 
 | ||||
| class DemoCGI < WEBrick::CGI | ||||
|   include DemoApplication | ||||
| end | ||||
| 
 | ||||
| config = { :NPH => false } | ||||
| cgi = DemoCGI.new(config, "multipart/form-data") | ||||
| cgi.start | ||||
							
								
								
									
										6
									
								
								sample/webrick/demo-servlet.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								sample/webrick/demo-servlet.rb
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,6 @@ | |||
| require "webrick" | ||||
| require "./demo-app" | ||||
| 
 | ||||
| class DemoServlet < WEBrick::HTTPServlet::AbstractServlet | ||||
|   include DemoApplication | ||||
| end | ||||
							
								
								
									
										12
									
								
								sample/webrick/demo-urlencoded.cgi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								sample/webrick/demo-urlencoded.cgi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | |||
| #!/usr/bin/env ruby | ||||
| require "webrick/cgi" | ||||
| require "webrick/https"  # should load if it runs on HTTPS server  | ||||
| require "./demo-app" | ||||
| 
 | ||||
| class DemoCGI < WEBrick::CGI | ||||
|   include DemoApplication | ||||
| end | ||||
| 
 | ||||
| config = { :NPH => false }  | ||||
| cgi = DemoCGI.new(config, "application/x-www-form-urlencoded") | ||||
| cgi.start | ||||
							
								
								
									
										11
									
								
								sample/webrick/hello.cgi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								sample/webrick/hello.cgi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,11 @@ | |||
| #!/usr/bin/env ruby | ||||
| require "webrick/cgi" | ||||
| 
 | ||||
| class HelloCGI < WEBrick::CGI | ||||
|   def do_GET(req, res) | ||||
|     res["content-type"] = "text/plain" | ||||
|     res.body = "Hello, world.\n" | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| HelloCGI.new.start | ||||
							
								
								
									
										8
									
								
								sample/webrick/hello.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								sample/webrick/hello.rb
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,8 @@ | |||
| require "webrick" | ||||
| 
 | ||||
| class HelloServlet < WEBrick::HTTPServlet::AbstractServlet | ||||
|   def do_GET(req, res) | ||||
|     res["content-type"] = "text/plain" | ||||
|     res.body = "Hello, world.\n" | ||||
|   end | ||||
| end | ||||
							
								
								
									
										23
									
								
								sample/webrick/httpd.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								sample/webrick/httpd.rb
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,23 @@ | |||
| require "webrick" | ||||
| 
 | ||||
| httpd = WEBrick::HTTPServer.new( | ||||
|   :DocumentRoot => File::dirname(__FILE__), | ||||
|   :Port         => 10080, | ||||
|   :Logger       => WEBrick::Log.new($stderr, WEBrick::Log::DEBUG), | ||||
|   :AccessLog    => [ | ||||
|     [ $stderr, WEBrick::AccessLog::COMMON_LOG_FORMAT  ], | ||||
|     [ $stderr, WEBrick::AccessLog::REFERER_LOG_FORMAT ], | ||||
|     [ $stderr, WEBrick::AccessLog::AGENT_LOG_FORMAT   ], | ||||
|   ], | ||||
|   :CGIPathEnv   => ENV["PATH"]   # PATH environment variable for CGI. | ||||
| ) | ||||
| 
 | ||||
| require "./hello" | ||||
| httpd.mount("/hello", HelloServlet) | ||||
| 
 | ||||
| require "./demo-servlet" | ||||
| httpd.mount("/urlencoded", DemoServlet, "application/x-www-form-urlencoded") | ||||
| httpd.mount("/multipart", DemoServlet, "multipart/form-data") | ||||
| 
 | ||||
| trap(:INT){ httpd.shutdown } | ||||
| httpd.start | ||||
							
								
								
									
										33
									
								
								sample/webrick/httpsd.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								sample/webrick/httpsd.rb
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,33 @@ | |||
| require "webrick" | ||||
| require "webrick/https" | ||||
| 
 | ||||
| hostname = WEBrick::Utils::getservername | ||||
| subject = [["O", "ruby-lang.org"], ["OU", "sample"], ["CN", hostname]] | ||||
| comment = "Comment for self-signed certificate" | ||||
| 
 | ||||
| httpd = WEBrick::HTTPServer.new( | ||||
|   :DocumentRoot   => File::dirname(__FILE__), | ||||
|   :Port           => 10443, | ||||
|   :SSLEnable      => true, | ||||
| 
 | ||||
|   # Specify key pair and server certificate. | ||||
|   # :SSLPrivateKey  => OpenSSL::PKey::RSA.new("server.key"), | ||||
|   # :SSLCertificate => OpenSSL::X509::Certificate.new("server.crt"), | ||||
| 
 | ||||
|   # specify the following SSL options if you want to use auto | ||||
|   # generated self-signed certificate. | ||||
|   :SSLCertName    => subject, | ||||
|   :SSLComment     => comment, | ||||
| 
 | ||||
|   :CGIPathEnv     => ENV["PATH"]  # PATH environment variable for CGI. | ||||
| ) | ||||
| 
 | ||||
| require "./hello" | ||||
| httpd.mount("/hello", HelloServlet) | ||||
| 
 | ||||
| require "./demo-servlet" | ||||
| httpd.mount("/urlencoded", DemoServlet, "application/x-www-form-urlencoded") | ||||
| httpd.mount("/multipart", DemoServlet, "multipart/form-data") | ||||
| 
 | ||||
| trap(:INT){ httpd.shutdown } | ||||
| httpd.start | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 (no author)
						(no author)