| Class | OpenWFE::OldRestServlet |
| In: |
lib/openwfe/orest/oldrestservlet.rb
|
| Parent: | WEBrick::HTTPServlet::AbstractServlet |
A common parent class for the worklist and the engine old-style (2002) REST interface.
| MUTEX | = | Mutex.new |
| CT | = | "Content-Type" |
Returns always the same servlet instance.
# File lib/openwfe/orest/oldrestservlet.rb, line 122
122: def self.get_instance (server, *options)
123: MUTEX.synchronize do
124: return @__instance__ if @__instance__
125: @__instance__ = self.new(server, *options)
126: end
127: end
# File lib/openwfe/orest/oldrestservlet.rb, line 58
58: def initialize (server, params)
59:
60: super
61:
62: @auth_system = params[:AuthSystem] || {}
63:
64: @realm_name = get_realm_name
65:
66: @last_given_session_id = -1
67: @sessions = {}
68: end
this default implementation returns "no_realm".
# File lib/openwfe/orest/oldrestservlet.rb, line 73
73: def get_realm_name
74: "no_realm"
75: end
# File lib/openwfe/orest/oldrestservlet.rb, line 77
77: def service req, res
78:
79: if req.request_method == 'POST'
80: class << req
81: def parse_query
82: @query = WEBrick::HTTPUtils::parse_query(@query_string)
83: end
84: end
85: end
86:
87: username = authenticate req, res
88:
89: if req.query_string == nil
90:
91: get_new_session username, req, res
92: return
93: end
94:
95: req.attributes['username'] = username
96:
97: action = req.query["action"]
98: action = action.downcase if action
99:
100: if action == "endworksession"
101: end_work_session req, res
102: return
103: end
104:
105: action_method = "do__#{action}".intern
106:
107: unless self.respond_to?(action_method)
108: action_not_implemented action, res
109: return
110: end
111:
112: begin
113: self.send action_method, req, res
114: rescue Exception => e
115: reply_with_exception res, e
116: end
117: end
# File lib/openwfe/orest/oldrestservlet.rb, line 203
203: def _authenticate user, pass
204:
205: if @auth_system.kind_of?(Hash)
206: @auth_system[user] == pass
207: elsif @auth_system.kind_of?(Proc)
208: @auth_system.call user, pass
209: elsif @auth_system.respond_to?(:authenticate)
210: @auth_system.authenticate user, pass
211: else
212: false
213: end
214: end
# File lib/openwfe/orest/oldrestservlet.rb, line 240
240: def action_not_implemented action, res
241:
242: reply_with_error(
243: res, 404, "action '#{action}' is not implemented.")
244: end
# File lib/openwfe/orest/oldrestservlet.rb, line 184
184: def authenticate req, res
185:
186: user = nil
187:
188: WEBrick::HTTPAuth::basic_auth(req, res, @realm_name) do |u, p|
189:
190: user = get_session_user req
191:
192: if user
193: true
194: else
195: user = u
196: _authenticate u, p
197: end
198: end
199:
200: user
201: end
# File lib/openwfe/orest/oldrestservlet.rb, line 216
216: def determine_agent (req)
217:
218: req.addr.join "|"
219: end
# File lib/openwfe/orest/oldrestservlet.rb, line 173
173: def end_work_session (req, res)
174:
175: sid = req.query['session']
176: @sessions.delete(Integer(sid)) if sid
177:
178: @logger.debug "end_work_session() #{sid}"
179: #@logger.debug "end_work_session() sessions : #{@sessions.size}"
180:
181: reply_with_xml(res, 200, REXML::Element.new('bye'))
182: end
# File lib/openwfe/orest/oldrestservlet.rb, line 221
221: def get_new_session username, req, res
222:
223: sid = new_session_id
224:
225: @sessions[sid] = [
226: username,
227: determine_agent(req),
228: Time.now.to_i
229: ]
230:
231: @logger.debug "get_new_session() #{sid}"
232: #@logger.debug "get_new_session() sessions : #{@sessions.size}"
233:
234: esess = REXML::Element.new 'session'
235: esess.add_attribute 'id', sid
236:
237: reply_with_xml res, 200, esess
238: end
# File lib/openwfe/orest/oldrestservlet.rb, line 259
259: def get_session_user (req)
260:
261: sid = req.query['session']
262:
263: @logger.debug "get_session_user() sid : #{sid}"
264:
265: return nil unless sid
266:
267: s = @sessions[Integer(sid)]
268:
269: return nil unless s
270:
271: username, agent, last_seen = s
272:
273: return username if agent == determine_agent(req)
274:
275: nil
276: end
# File lib/openwfe/orest/oldrestservlet.rb, line 246
246: def new_session_id
247: MUTEX.synchronize do
248:
249: id = Integer(Time.new.to_f * 100000)
250:
251: id = @last_given_session_id + 1 \
252: if id <= @last_given_session_id
253:
254: @last_given_session_id = id
255: id
256: end
257: end
# File lib/openwfe/orest/oldrestservlet.rb, line 131
131: def reply_with_error (res, code, error_message)
132:
133: res.status = code
134: res[CT] = "text/plain"
135: res.body = error_message
136: end
# File lib/openwfe/orest/oldrestservlet.rb, line 138
138: def reply_with_exception (res, exception)
139:
140: message = exception.message
141:
142: ms = message.split
143:
144: code = 500
145: body = message
146:
147: if ms.length > 1 and ms[0].to_i != 0
148: code = Integer(ms[0])
149: body = message[4..-1]
150: end
151:
152: message << "\n"
153: message << OpenWFE::exception_to_s(exception)
154: message << "\n"
155:
156: reply_with_error(res, code, body)
157: end
# File lib/openwfe/orest/oldrestservlet.rb, line 159
159: def reply_with_xml (res, code, xml)
160:
161: res.status = code
162: res[CT] = "application/xml"
163:
164: if xml.kind_of?(REXML::Element)
165: doc = REXML::Document.new
166: doc << xml
167: xml = OpenWFE::xml_to_s(doc)
168: end
169:
170: res.body = xml
171: end