oneapi-ruby 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +202 -0
- data/README.md +102 -0
- data/Rakefile +8 -0
- data/examples/example_customer_profile.rb +29 -0
- data/examples/example_get_hlr.rb +34 -0
- data/examples/example_get_inbound_messages.rb +26 -0
- data/examples/example_on_inbound_message.rb +13 -0
- data/examples/example_send_hlr_and_wait_for_delivery_push.rb +50 -0
- data/examples/example_send_message_and_check_delivery_status.rb +53 -0
- data/examples/example_send_message_and_wait_for_delivery_push.rb +56 -0
- data/lib/oneapi-ruby.rb +8 -0
- data/lib/oneapi-ruby/client.rb +309 -0
- data/lib/oneapi-ruby/models.rb +205 -0
- data/lib/oneapi-ruby/objects.rb +174 -0
- data/lib/oneapi-ruby/utils.rb +164 -0
- data/lib/oneapi-ruby/version.rb +3 -0
- data/oneapi-ruby.gemspec +23 -0
- data/test/test.rb +69 -0
- metadata +93 -0
@@ -0,0 +1,205 @@
|
|
1
|
+
require_relative 'objects'
|
2
|
+
|
3
|
+
# ----------------------------------------------------------------------------------------------------
|
4
|
+
# Generic:
|
5
|
+
# ----------------------------------------------------------------------------------------------------
|
6
|
+
|
7
|
+
module OneApi
|
8
|
+
|
9
|
+
class OneApiAuthentication < OneApiModel
|
10
|
+
|
11
|
+
oneapi_attr_accessor :username, FieldConversionRule.new()
|
12
|
+
oneapi_attr_accessor :password, FieldConversionRule.new()
|
13
|
+
oneapi_attr_accessor :ibsso_token, FieldConversionRule.new('login.ibAuthCookie | TODO')
|
14
|
+
oneapi_attr_accessor :authenticated, FieldConversionRule.new()
|
15
|
+
oneapi_attr_accessor :verified, FieldConversionRule.new('login.verified | TODO')
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
class OneApiError < OneApiModel
|
20
|
+
|
21
|
+
oneapi_attr_accessor :message_id, FieldConversionRule.new('requestError.serviceException.messageId | requestError.policyException.messageId')
|
22
|
+
oneapi_attr_accessor :text, FieldConversionRule.new('requestError.serviceException.text | requestError.policyException.text')
|
23
|
+
oneapi_attr_accessor :variables, FieldConversionRule.new('requestError.serviceException.variables | requestError.policyException.variables')
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
class GenericObject < OneApiModel
|
28
|
+
|
29
|
+
# FIXME: WIthout this it is not a valid model
|
30
|
+
oneapi_attr_accessor :ignore, FieldConversionRule.new(:ignore)
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
# ----------------------------------------------------------------------------------------------------
|
35
|
+
# Messaging:
|
36
|
+
# ----------------------------------------------------------------------------------------------------
|
37
|
+
|
38
|
+
class SMSRequest < OneApiModel
|
39
|
+
|
40
|
+
oneapi_attr_accessor :sender_address, FieldConversionRule.new(:senderAddress)
|
41
|
+
oneapi_attr_accessor :sender_name, FieldConversionRule.new(:senderName)
|
42
|
+
oneapi_attr_accessor :message, FieldConversionRule.new()
|
43
|
+
oneapi_attr_accessor :address, FieldConversionRule.new()
|
44
|
+
oneapi_attr_accessor :client_correlator, FieldConversionRule.new(:clientCorrelator)
|
45
|
+
oneapi_attr_accessor :notify_url, FieldConversionRule.new(:notifyUrl)
|
46
|
+
oneapi_attr_accessor :callback_data, FieldConversionRule.new()
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
class ResourceReference < OneApiModel
|
51
|
+
|
52
|
+
oneapi_attr_accessor :client_correlator, LastPartOfUrlFieldConversionRule.new('resourceReference.resourceURL')
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
class DeliveryInfo < OneApiModel
|
57
|
+
|
58
|
+
oneapi_attr_accessor :address, FieldConversionRule.new(:address)
|
59
|
+
oneapi_attr_accessor :delivery_status, FieldConversionRule.new(:deliveryStatus)
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
class DeliveryInfoList < OneApiModel
|
64
|
+
|
65
|
+
oneapi_attr_accessor :delivery_info, ObjectArrayConversionRule.new(DeliveryInfo, json_field_name='deliveryInfoList.deliveryInfo')
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
class DeliveryInfoNotification < OneApiModel
|
70
|
+
|
71
|
+
oneapi_attr_accessor :delivery_info, ObjectFieldConverter.new(DeliveryInfo, 'deliveryInfoNotification.deliveryInfo')
|
72
|
+
oneapi_attr_accessor :callback_data, FieldConversionRule.new('deliveryInfoNotification.callbackData')
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
# ----------------------------------------------------------------------------------------------------
|
77
|
+
# HLR:
|
78
|
+
# ----------------------------------------------------------------------------------------------------
|
79
|
+
|
80
|
+
class ServingMccMnc < OneApiModel
|
81
|
+
|
82
|
+
oneapi_attr_accessor :mcc, FieldConversionRule.new(:mcc)
|
83
|
+
oneapi_attr_accessor :mnc, FieldConversionRule.new(:mnc)
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
class TerminalRoamingExtendedData < OneApiModel
|
88
|
+
|
89
|
+
oneapi_attr_accessor :destination_address, FieldConversionRule.new('destinationAddress')
|
90
|
+
oneapi_attr_accessor :status_id, FieldConversionRule.new('statusId')
|
91
|
+
oneapi_attr_accessor :done_time, FieldConversionRule.new('doneTime')
|
92
|
+
oneapi_attr_accessor :price_per_message, FieldConversionRule.new('pricePerMessage')
|
93
|
+
oneapi_attr_accessor :mcc_mnc, FieldConversionRule.new('mccMnc')
|
94
|
+
oneapi_attr_accessor :serving_msc, FieldConversionRule.new('servingMsc')
|
95
|
+
oneapi_attr_accessor :censored_serving_msc, FieldConversionRule.new('censoredServingMsc')
|
96
|
+
oneapi_attr_accessor :gsm_error_code, FieldConversionRule.new('gsmErrorCode')
|
97
|
+
oneapi_attr_accessor :original_network_name, FieldConversionRule.new('originalNetworkName')
|
98
|
+
oneapi_attr_accessor :ported_network_name, FieldConversionRule.new('portedNetworkName')
|
99
|
+
oneapi_attr_accessor :serving_hlr, FieldConversionRule.new('servingHlr')
|
100
|
+
oneapi_attr_accessor :imsi, FieldConversionRule.new('imsi')
|
101
|
+
oneapi_attr_accessor :original_network_prefix, FieldConversionRule.new('originalNetworkPrefix')
|
102
|
+
oneapi_attr_accessor :original_country_prefix, FieldConversionRule.new('originalCountryPrefix')
|
103
|
+
oneapi_attr_accessor :original_country_name, FieldConversionRule.new('originalCountryName')
|
104
|
+
oneapi_attr_accessor :is_number_ported, FieldConversionRule.new('isNumberPorted')
|
105
|
+
oneapi_attr_accessor :ported_network_prefix, FieldConversionRule.new('portedNetworkPrefix')
|
106
|
+
oneapi_attr_accessor :ported_country_prefix, FieldConversionRule.new('portedCountryPrefix')
|
107
|
+
oneapi_attr_accessor :ported_country_name, FieldConversionRule.new('portedCountryName')
|
108
|
+
oneapi_attr_accessor :number_in_roaming, FieldConversionRule.new('numberInRoaming')
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
class TerminalRoamingStatus < OneApiModel
|
113
|
+
|
114
|
+
oneapi_attr_accessor :servingMccMnc, ObjectFieldConverter.new(ServingMccMnc, 'servingMccMnc')
|
115
|
+
oneapi_attr_accessor :address, FieldConversionRule.new()
|
116
|
+
oneapi_attr_accessor :currentRoaming, FieldConversionRule.new('currentRoaming')
|
117
|
+
oneapi_attr_accessor :resourceURL, FieldConversionRule.new('resourceURL')
|
118
|
+
oneapi_attr_accessor :retrievalStatus, FieldConversionRule.new('retrievalStatus')
|
119
|
+
oneapi_attr_accessor :callbackData, FieldConversionRule.new('callbackData')
|
120
|
+
oneapi_attr_accessor :extendedData, ObjectFieldConverter.new(TerminalRoamingExtendedData, 'extendedData')
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
class TerminalRoamingStatusNotification < OneApiModel
|
126
|
+
|
127
|
+
oneapi_attr_accessor :delivery_info, ObjectFieldConverter.new(TerminalRoamingStatus, 'terminalRoamingStatusList.roaming')
|
128
|
+
oneapi_attr_accessor :callback_data, FieldConversionRule.new('terminalRoamingStatusList.roaming.callbackData')
|
129
|
+
|
130
|
+
end
|
131
|
+
|
132
|
+
# ----------------------------------------------------------------------------------------------------
|
133
|
+
# Customer profile:
|
134
|
+
# ----------------------------------------------------------------------------------------------------
|
135
|
+
|
136
|
+
class CustomerProfile < OneApiModel
|
137
|
+
|
138
|
+
oneapi_attr_accessor :id, FieldConversionRule.new()
|
139
|
+
oneapi_attr_accessor :username, FieldConversionRule.new()
|
140
|
+
oneapi_attr_accessor :forename, FieldConversionRule.new()
|
141
|
+
oneapi_attr_accessor :surname, FieldConversionRule.new()
|
142
|
+
oneapi_attr_accessor :street, FieldConversionRule.new()
|
143
|
+
oneapi_attr_accessor :city, FieldConversionRule.new()
|
144
|
+
oneapi_attr_accessor :zip_code, FieldConversionRule.new('zipCode')
|
145
|
+
oneapi_attr_accessor :telephone, FieldConversionRule.new()
|
146
|
+
oneapi_attr_accessor :gsm, FieldConversionRule.new()
|
147
|
+
oneapi_attr_accessor :fax, FieldConversionRule.new()
|
148
|
+
oneapi_attr_accessor :email, FieldConversionRule.new()
|
149
|
+
oneapi_attr_accessor :msn, FieldConversionRule.new()
|
150
|
+
oneapi_attr_accessor :skype, FieldConversionRule.new()
|
151
|
+
oneapi_attr_accessor :country_id, FieldConversionRule.new('countryId')
|
152
|
+
oneapi_attr_accessor :timezone_id, FieldConversionRule.new('timezoneId')
|
153
|
+
oneapi_attr_accessor :primary_language_id, FieldConversionRule.new('primaryLanguageId')
|
154
|
+
oneapi_attr_accessor :secondary_language_id, FieldConversionRule.new('secondaryLanguageId')
|
155
|
+
|
156
|
+
end
|
157
|
+
|
158
|
+
class Currency < OneApiModel
|
159
|
+
|
160
|
+
oneapi_attr_accessor :id, FieldConversionRule.new()
|
161
|
+
oneapi_attr_accessor :currency_name, FieldConversionRule.new('currencyName')
|
162
|
+
oneapi_attr_accessor :symbol, FieldConversionRule.new()
|
163
|
+
|
164
|
+
end
|
165
|
+
|
166
|
+
class Currency < OneApiModel
|
167
|
+
|
168
|
+
oneapi_attr_accessor :id, FieldConversionRule.new()
|
169
|
+
oneapi_attr_accessor :currency_name, FieldConversionRule.new('currencyName')
|
170
|
+
oneapi_attr_accessor :symbol, FieldConversionRule.new()
|
171
|
+
|
172
|
+
end
|
173
|
+
|
174
|
+
class AccountBalance < OneApiModel
|
175
|
+
|
176
|
+
oneapi_attr_accessor :balance, FieldConversionRule.new()
|
177
|
+
oneapi_attr_accessor :currency, ObjectFieldConverter.new(Currency)
|
178
|
+
|
179
|
+
end
|
180
|
+
|
181
|
+
# ----------------------------------------------------------------------------------------------------
|
182
|
+
# Inbound:
|
183
|
+
# ----------------------------------------------------------------------------------------------------
|
184
|
+
|
185
|
+
class InboundSmsMessage < OneApiModel
|
186
|
+
|
187
|
+
oneapi_attr_accessor :date_time, FieldConversionRule.new('dateTime')
|
188
|
+
oneapi_attr_accessor :destination_address, FieldConversionRule.new('destinationAddress')
|
189
|
+
oneapi_attr_accessor :message_id, FieldConversionRule.new('messageId')
|
190
|
+
oneapi_attr_accessor :message, FieldConversionRule.new('message')
|
191
|
+
oneapi_attr_accessor :resource_url, FieldConversionRule.new('resourceURL')
|
192
|
+
oneapi_attr_accessor :sender_address, FieldConversionRule.new('senderAddress')
|
193
|
+
|
194
|
+
end
|
195
|
+
|
196
|
+
class InboundSmsMessages < OneApiModel
|
197
|
+
|
198
|
+
oneapi_attr_accessor :inbound_sms_message, ObjectArrayConversionRule.new(InboundSmsMessage, 'inboundSMSMessageList.inboundSMSMessage')
|
199
|
+
oneapi_attr_accessor :number_of_messages_in_this_batch, FieldConversionRule.new('inboundSMSMessageList.numberOfMessagesInThisBatch')
|
200
|
+
oneapi_attr_accessor :total_number_of_pending_messages, FieldConversionRule.new('inboundSMSMessageList.totalNumberOfPendingMessages')
|
201
|
+
oneapi_attr_accessor :callback_data, FieldConversionRule.new('inboundSMSMessageList.callbackData')
|
202
|
+
|
203
|
+
end
|
204
|
+
|
205
|
+
end
|
@@ -0,0 +1,174 @@
|
|
1
|
+
=begin
|
2
|
+
require_relative 'rubygems'
|
3
|
+
require_relative 'ruby-debug'
|
4
|
+
=end
|
5
|
+
|
6
|
+
require_relative 'utils'
|
7
|
+
|
8
|
+
module OneApi
|
9
|
+
|
10
|
+
class FieldConversionRule
|
11
|
+
|
12
|
+
attr_accessor :object_field_name
|
13
|
+
attr_accessor :json_field_name
|
14
|
+
|
15
|
+
def initialize(json_field_name=nil)
|
16
|
+
@json_field_name = json_field_name
|
17
|
+
@object_field_name = nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def from_json(value)
|
21
|
+
value
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_json(value)
|
25
|
+
value
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
class ObjectFieldConverter < FieldConversionRule
|
32
|
+
|
33
|
+
def initialize(classs, json_field_name=nil)
|
34
|
+
super(json_field_name)
|
35
|
+
@classs = classs
|
36
|
+
end
|
37
|
+
|
38
|
+
def from_json(value)
|
39
|
+
if value == nil
|
40
|
+
return nil
|
41
|
+
end
|
42
|
+
|
43
|
+
return Conversions.from_json(@classs, value, is_error=nil)
|
44
|
+
end
|
45
|
+
|
46
|
+
def to_json(value)
|
47
|
+
# TODO
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
class ObjectArrayConversionRule < FieldConversionRule
|
53
|
+
|
54
|
+
def initialize(classs, json_field_name=nil)
|
55
|
+
super(json_field_name)
|
56
|
+
@classs = classs
|
57
|
+
end
|
58
|
+
|
59
|
+
def from_json(values)
|
60
|
+
if not values
|
61
|
+
return []
|
62
|
+
end
|
63
|
+
|
64
|
+
result = []
|
65
|
+
|
66
|
+
for value in values
|
67
|
+
result.push(Conversions.from_json(@classs, value, is_error=nil))
|
68
|
+
end
|
69
|
+
|
70
|
+
return result
|
71
|
+
end
|
72
|
+
|
73
|
+
def to_json(value)
|
74
|
+
# TODO
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
class LastPartOfUrlFieldConversionRule < FieldConversionRule
|
80
|
+
|
81
|
+
def initialize(json_field_name=nil)
|
82
|
+
super(json_field_name)
|
83
|
+
end
|
84
|
+
|
85
|
+
def from_json(value)
|
86
|
+
if ! value
|
87
|
+
return nil
|
88
|
+
end
|
89
|
+
|
90
|
+
parts = value.split('/')
|
91
|
+
|
92
|
+
parts[-1]
|
93
|
+
end
|
94
|
+
|
95
|
+
def to_json(value)
|
96
|
+
value
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
class Conversions
|
102
|
+
|
103
|
+
def self.from_json(classs, json, is_error=nil)
|
104
|
+
object = classs.new
|
105
|
+
|
106
|
+
Conversions.fill_from_json(object, json, is_error)
|
107
|
+
|
108
|
+
object
|
109
|
+
end
|
110
|
+
|
111
|
+
def self.fill_from_json(object, json, is_error=nil)
|
112
|
+
if is_error
|
113
|
+
object.exception = Conversions.from_json(OneApiError, json, false)
|
114
|
+
return
|
115
|
+
end
|
116
|
+
|
117
|
+
json = JSONUtils.get_json(json)
|
118
|
+
conversion_rules = OneApiAccessorModifier.get_field_conversion_rules(object.class)
|
119
|
+
for conversion_rule in conversion_rules
|
120
|
+
json_value = JSONUtils.get(json, conversion_rule.json_field_name)
|
121
|
+
value = conversion_rule.from_json(json_value)
|
122
|
+
object.instance_variable_set("@#{conversion_rule.object_field_name}", value)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def self.to_json
|
127
|
+
# TODO(TK)
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
131
|
+
|
132
|
+
module OneApiAccessorModifier
|
133
|
+
|
134
|
+
@@field_conversion_rules = {}
|
135
|
+
|
136
|
+
def oneapi_attr_accessor(attr, field_conversion_rule)
|
137
|
+
attr_accessor attr
|
138
|
+
|
139
|
+
field_conversion_rule.object_field_name = attr
|
140
|
+
|
141
|
+
if Utils.empty(field_conversion_rule.json_field_name)
|
142
|
+
field_conversion_rule.json_field_name = attr
|
143
|
+
end
|
144
|
+
|
145
|
+
if not @@field_conversion_rules.has_key? self then
|
146
|
+
@@field_conversion_rules[self] = []
|
147
|
+
end
|
148
|
+
|
149
|
+
@@field_conversion_rules[self].push field_conversion_rule
|
150
|
+
#puts "field_conversion_rules is now #{@@field_conversion_rules}"
|
151
|
+
end
|
152
|
+
|
153
|
+
def OneApiAccessorModifier.get_field_conversion_rules(classs)
|
154
|
+
@@field_conversion_rules[classs]
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|
158
|
+
|
159
|
+
class OneApiModel
|
160
|
+
|
161
|
+
extend OneApiAccessorModifier
|
162
|
+
|
163
|
+
attr_accessor :exception
|
164
|
+
|
165
|
+
def initialize
|
166
|
+
end
|
167
|
+
|
168
|
+
def is_success
|
169
|
+
return @exception == nil
|
170
|
+
end
|
171
|
+
|
172
|
+
end
|
173
|
+
|
174
|
+
end
|
@@ -0,0 +1,164 @@
|
|
1
|
+
#require 'pry'
|
2
|
+
require 'json'
|
3
|
+
require 'socket'
|
4
|
+
|
5
|
+
module OneApi
|
6
|
+
|
7
|
+
class JSONUtils
|
8
|
+
|
9
|
+
def self.get_json(json)
|
10
|
+
if json.instance_of? String
|
11
|
+
return JSON.parse(json)
|
12
|
+
end
|
13
|
+
|
14
|
+
return json
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.get(json, field)
|
18
|
+
json = JSONUtils.get_json(json)
|
19
|
+
|
20
|
+
if not field
|
21
|
+
return nil
|
22
|
+
end
|
23
|
+
|
24
|
+
if field.instance_of? Symbol
|
25
|
+
field = field.to_s
|
26
|
+
end
|
27
|
+
|
28
|
+
if field.include?('|') then
|
29
|
+
field_parts = field.split('|')
|
30
|
+
for field_part in field_parts
|
31
|
+
value = JSONUtils.get(json, field_part.strip)
|
32
|
+
if value
|
33
|
+
return value
|
34
|
+
end
|
35
|
+
end
|
36
|
+
return nil
|
37
|
+
end
|
38
|
+
|
39
|
+
result = nil
|
40
|
+
parts = field.split('.')
|
41
|
+
result = json
|
42
|
+
for part in parts
|
43
|
+
if result == nil
|
44
|
+
return nil
|
45
|
+
end
|
46
|
+
|
47
|
+
if part.to_i.to_s == part
|
48
|
+
# Int index => array:
|
49
|
+
result = result[part.to_i]
|
50
|
+
else
|
51
|
+
# Hash:
|
52
|
+
result = result[part]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
result
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
class Utils
|
62
|
+
|
63
|
+
def self.empty(obj)
|
64
|
+
if obj == nil
|
65
|
+
return true
|
66
|
+
end
|
67
|
+
|
68
|
+
if obj.instance_of? Hash or obj.instance_of? Array or obj.instance_of? String
|
69
|
+
return obj.size == 0
|
70
|
+
end
|
71
|
+
|
72
|
+
return obj == 0
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.get_random_string(length, chars)
|
76
|
+
if not length
|
77
|
+
raise "Invalid random string length: #{length}"
|
78
|
+
end
|
79
|
+
if not chars
|
80
|
+
raise "Invalid random chars: #{chars}"
|
81
|
+
end
|
82
|
+
|
83
|
+
result = ''
|
84
|
+
|
85
|
+
for i in 0..length
|
86
|
+
result += chars[rand(chars.length - 1), 1]
|
87
|
+
end
|
88
|
+
|
89
|
+
result
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.get_random_alphanumeric_string(length=10)
|
93
|
+
get_random_string(length, 'qwertzuiopasdfghjklyxcvbnm123456789')
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
# Web server, to be used only in examples
|
99
|
+
class DummyWebServer
|
100
|
+
|
101
|
+
attr_accessor :requests
|
102
|
+
|
103
|
+
def initialize(ip_address, port)
|
104
|
+
@webserver = TCPServer.new(ip_address, port)
|
105
|
+
@session = nil
|
106
|
+
@requests = []
|
107
|
+
end
|
108
|
+
|
109
|
+
def start(seconds)
|
110
|
+
Thread.new {
|
111
|
+
while (@session = @webserver.accept)
|
112
|
+
request_string = @session.sysread 10000
|
113
|
+
@session.print "HTTP/1.1 200/OK\r\nContent-type:text/html\r\n\r\n"
|
114
|
+
@session.print("OK")
|
115
|
+
@session.close
|
116
|
+
@requests.push(parse_request_string request_string)
|
117
|
+
end
|
118
|
+
}
|
119
|
+
|
120
|
+
sleep(seconds)
|
121
|
+
|
122
|
+
@webserver.close
|
123
|
+
if @session != nil
|
124
|
+
begin
|
125
|
+
@session.close
|
126
|
+
rescue
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def parse_request_string request_string
|
132
|
+
lines = request_string.split(/\n/)
|
133
|
+
method, url, http_version = lines[0].split(' ')
|
134
|
+
headers = {}
|
135
|
+
body = nil
|
136
|
+
for line in lines[1,lines.length]
|
137
|
+
if body == nil
|
138
|
+
if line.strip == ''
|
139
|
+
body = ''
|
140
|
+
else
|
141
|
+
index = line.index ':'
|
142
|
+
key = line[0,index].strip
|
143
|
+
value = line[index + 1, line.length].strip
|
144
|
+
headers[key] = value
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
if body != nil
|
149
|
+
body += line + "\n"
|
150
|
+
end
|
151
|
+
end
|
152
|
+
return method, url, headers, body.strip
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
156
|
+
|
157
|
+
=begin
|
158
|
+
dummy_web_server = DummyWebServer.new('localhost', 2000)
|
159
|
+
dummy_web_server.start 10
|
160
|
+
puts dummy_web_server.requests
|
161
|
+
=end
|
162
|
+
|
163
|
+
|
164
|
+
end
|