-
Notifications
You must be signed in to change notification settings - Fork 70
/
httpserver.rb
151 lines (116 loc) · 4.02 KB
/
httpserver.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# encoding: UTF-8
# SOAP4R - WEBrick HTTP Server
# Copyright (C) 2000-2007 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 'logger'
require 'logger-application' unless defined?(Logger::Application)
require 'soap/attrproxy'
require 'soap/rpc/soaplet'
require 'soap/streamHandler'
require 'webrick'
module SOAP
module RPC
class HTTPServer < Logger::Application
include AttrProxy
attr_reader :server
attr_accessor :default_namespace
attr_proxy :mapping_registry, true
attr_proxy :literal_mapping_registry, true
attr_proxy :generate_explicit_type, true
attr_proxy :use_default_namespace, true
def initialize(config)
actor = config[:SOAPHTTPServerApplicationName] || self.class.name
super(actor)
@default_namespace = config[:SOAPDefaultNamespace]
@webrick_config = config.dup
self.level = Logger::Severity::ERROR # keep silent by default
@webrick_config[:Logger] ||= @log
@log = @webrick_config[:Logger] # sync logger of App and HTTPServer
@router = ::SOAP::RPC::Router.new(actor)
@soaplet = ::SOAP::RPC::SOAPlet.new(@router)
on_init
@server = WEBrick::HTTPServer.new(@webrick_config)
@server.mount('/soaprouter', @soaplet)
if wsdldir = config[:WSDLDocumentDirectory]
@server.mount('/wsdl', WEBrick::HTTPServlet::FileHandler, wsdldir)
end
@server.mount('/', @soaplet)
end
def on_init
# do extra initialization in a derived class if needed.
end
def status
@server.status if @server
end
def shutdown
if @server
@server.shutdown
while (@server.listeners.length > 0) && (@server.tokens.length > 0) && (@server.status != :Stop)
sleep(0.25)
end
sleep(0.25) # One more for good measure.
end
end
def authenticator
@soaplet.authenticator
end
def authenticator=(authenticator)
@soaplet.authenticator = authenticator
end
# servant entry interface
def add_rpc_request_servant(factory, namespace = @default_namespace)
@router.add_rpc_request_servant(factory, namespace)
end
def add_rpc_servant(obj, namespace = @default_namespace)
@router.add_rpc_servant(obj, namespace)
end
def add_request_headerhandler(factory)
@router.add_request_headerhandler(factory)
end
def add_headerhandler(obj)
@router.add_headerhandler(obj)
end
alias add_rpc_headerhandler add_headerhandler
def filterchain
@router.filterchain
end
# method entry interface
def add_rpc_method(obj, name, *param)
add_rpc_method_as(obj, name, name, *param)
end
alias add_method add_rpc_method
def add_rpc_method_as(obj, name, name_as, *param)
qname = XSD::QName.new(@default_namespace, name_as)
soapaction = nil
param_def = SOAPMethod.derive_rpc_param_def(obj, name, *param)
@router.add_rpc_operation(obj, qname, soapaction, name, param_def)
end
alias add_method_as add_rpc_method_as
def add_document_method(obj, soapaction, name, req_qnames, res_qnames)
param_def = SOAPMethod.create_doc_param_def(req_qnames, res_qnames)
@router.add_document_operation(obj, soapaction, name, param_def)
end
def add_rpc_operation(receiver, qname, soapaction, name, param_def, opt = {})
@router.add_rpc_operation(receiver, qname, soapaction, name, param_def, opt)
end
def add_rpc_request_operation(factory, qname, soapaction, name, param_def, opt = {})
@router.add_rpc_request_operation(factory, qname, soapaction, name, param_def, opt)
end
def add_document_operation(receiver, soapaction, name, param_def, opt = {})
@router.add_document_operation(receiver, soapaction, name, param_def, opt)
end
def add_document_request_operation(factory, soapaction, name, param_def, opt = {})
@router.add_document_request_operation(factory, soapaction, name, param_def, opt)
end
private
def attrproxy
@router
end
def run
@server.start
end
end
end
end