libgss 0.9.0 → 0.10.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 +4 -4
- data/lib/libgss.rb +37 -0
- data/lib/libgss/action_request.rb +3 -2
- data/lib/libgss/network.rb +36 -15
- data/lib/libgss/version.rb +1 -1
- data/spec/libgss/network_spec.rb +6 -12
- data/spec/libgss/server_block_spec.rb +29 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 04a7f3350eb992b75f94b53b265dcaccf33aa168
|
4
|
+
data.tar.gz: 3f915ba45f3bfbf49cc8313b7b61b465882d36f7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 428061466d77c8e1764bd3c4bc21430c70d77ac31704a31bd4ab133188ddfbd631b072443c415ae3bff53f52910c3fe908875f179cc3a3de862260dfcc821ac3
|
7
|
+
data.tar.gz: e020cecda53511ceb7e739340b9d68d6aa864714408534a778f791134ea1aa43aa5b4afa172e5c7fe5cb322d6ed82701104806b585f9768f533757d12a334278
|
data/lib/libgss.rb
CHANGED
@@ -20,6 +20,43 @@ module Libgss
|
|
20
20
|
|
21
21
|
MAX_RETRY_COUNT = (ENV["LIBGSS_MAX_RETRY_COUNT"] || 10).to_i
|
22
22
|
|
23
|
+
class Error < StandardError; end
|
24
|
+
class ClientError < Error; end
|
25
|
+
|
26
|
+
class ErrorResponse < Error
|
27
|
+
class << self
|
28
|
+
def subclasses
|
29
|
+
@subclasses ||= []
|
30
|
+
end
|
31
|
+
def inherited(klass)
|
32
|
+
subclasses << klass
|
33
|
+
end
|
34
|
+
def build(res)
|
35
|
+
return nil if res.nil?
|
36
|
+
klass = subclasses.detect{|k| k.respond_to?(:match?) && k.match?(res)} || self
|
37
|
+
klass.new(res.status, res.content)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
attr_reader :status
|
42
|
+
def initialize(status, message)
|
43
|
+
@status = status
|
44
|
+
super(message)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
class InvalidResponse < ErrorResponse
|
49
|
+
end
|
50
|
+
|
51
|
+
class ServerBlockError < ErrorResponse
|
52
|
+
STATUS = 503
|
53
|
+
BODY = "api maintenance".freeze
|
54
|
+
def self.match?(res)
|
55
|
+
res.content.nil? ? false :
|
56
|
+
(res.status == STATUS) && (res.content.strip == BODY)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
23
60
|
class << self
|
24
61
|
|
25
62
|
def with_retry(name)
|
@@ -70,10 +70,11 @@ module Libgss
|
|
70
70
|
|
71
71
|
# レスポンスの処理を行います
|
72
72
|
def process_response(res, req_type)
|
73
|
-
case res.
|
73
|
+
case res.status.to_i
|
74
74
|
when 200..299 then # OK
|
75
75
|
else
|
76
|
-
raise Error, "failed to send #{req_type}: [#{res.
|
76
|
+
# raise Error, "failed to send #{req_type}: [#{res.status}] #{res.content}"
|
77
|
+
raise ErrorResponse.build(res)
|
77
78
|
end
|
78
79
|
verify_signature(res) do |content|
|
79
80
|
begin
|
data/lib/libgss/network.rb
CHANGED
@@ -12,8 +12,7 @@ module Libgss
|
|
12
12
|
|
13
13
|
class Network
|
14
14
|
|
15
|
-
|
16
|
-
end
|
15
|
+
Error = Libgss::Error
|
17
16
|
|
18
17
|
attr_reader :base_url
|
19
18
|
attr_reader :ssl_base_url
|
@@ -52,6 +51,7 @@ module Libgss
|
|
52
51
|
# @option options [String] :platform 接続先のGSSサーバの認証のプラットフォーム。デフォルトは"fontana"。
|
53
52
|
# @option options [String] :api_version APIのバージョン。デフォルトは "1.0.0"
|
54
53
|
# @option options [String] :player_id 接続に使用するプレイヤのID
|
54
|
+
# @option options [Hash] :player_info pf_player_info として格納されるはずの諸情報
|
55
55
|
# @option options [String] :consumer_secret GSSサーバとクライアントの間で行う署名の検証に使用される文字列。
|
56
56
|
# @option options [Boolean] :ignore_oauth_nonce OAuth認証時にoauth_nonceとoauth_timestampを使用しないかどうか。
|
57
57
|
# @option options [String] :oauth_nonce OAuth認証のoauth_nonceパラメータ
|
@@ -105,13 +105,14 @@ module Libgss
|
|
105
105
|
# @param [Hash] extra オプション
|
106
106
|
# @option extra [Integer] :device_type デバイス種別
|
107
107
|
# @option extra [Integer] :device_id デバイス識別子
|
108
|
-
# @return [
|
109
|
-
def
|
108
|
+
# @return [Integer, false, Error] 基本的にサーバが返したレスポンスのステータスを返しますが、200番台でも検証に失敗した場合などは、falseあるいは例外オブジェクトを返します。
|
109
|
+
def login_and_status(extra = {})
|
110
110
|
@player_info[:id] = player_id
|
111
111
|
@player_info.update(extra)
|
112
|
-
attrs = @player_info.each_with_object({}){|(k,v), d| d[ "player[#{k}]" ] = v }
|
112
|
+
# attrs = @player_info.each_with_object({}){|(k,v), d| d[ "player[#{k}]" ] = v }
|
113
|
+
json = {"player" => @player_info}.to_json
|
113
114
|
res = Libgss.with_retry("login") do
|
114
|
-
@httpclient.post(login_url,
|
115
|
+
@httpclient.post(login_url, json, req_headers)
|
115
116
|
end
|
116
117
|
process_json_response(res) do |obj|
|
117
118
|
@player_id ||= obj["player_id"]
|
@@ -121,14 +122,31 @@ module Libgss
|
|
121
122
|
end
|
122
123
|
end
|
123
124
|
|
125
|
+
# GSSサーバに接続してログインの検証と処理を行います。
|
126
|
+
#
|
127
|
+
# @param [Hash] extra オプション
|
128
|
+
# @option extra [Integer] :device_type デバイス種別
|
129
|
+
# @option extra [Integer] :device_id デバイス識別子
|
130
|
+
# @return [Boolean] ログインに成功した場合はtrue、失敗した場合はfalse
|
131
|
+
def login(extra = {})
|
132
|
+
case login_and_status(extra)
|
133
|
+
when 200...300 then true
|
134
|
+
else false
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
124
138
|
# GSSサーバに接続してログインの検証と処理を行います。
|
125
139
|
#
|
126
140
|
# @param [Hash] extra オプション
|
127
141
|
# @see #login
|
128
142
|
# @return ログインに成功した場合は自身のオブジェクト返します。失敗した場合はLibgss::Network::Errorがraiseされます。
|
129
143
|
def login!(extra = {})
|
130
|
-
|
131
|
-
|
144
|
+
result = login_and_status(extra)
|
145
|
+
case result
|
146
|
+
when 200...300 then return self
|
147
|
+
when ErrorResponse then raise result
|
148
|
+
else raise Error, "Login Failure"
|
149
|
+
end
|
132
150
|
end
|
133
151
|
|
134
152
|
# @return [Boolean] コンストラクタに指定されたignore_signature_keyを返します
|
@@ -227,6 +245,7 @@ module Libgss
|
|
227
245
|
|
228
246
|
def req_headers
|
229
247
|
{
|
248
|
+
"Content-Type" => "application/json",
|
230
249
|
"X-Device-Type" => device_type_cd,
|
231
250
|
"X-Client-Version" => client_version,
|
232
251
|
}
|
@@ -245,19 +264,21 @@ module Libgss
|
|
245
264
|
end
|
246
265
|
|
247
266
|
def process_json_response(res)
|
248
|
-
|
267
|
+
result = res.status
|
268
|
+
case result
|
249
269
|
when 200...300 then # OK
|
250
|
-
when 300...
|
251
|
-
|
252
|
-
|
253
|
-
|
270
|
+
when 300...600 then
|
271
|
+
return ErrorResponse.build(res)
|
272
|
+
else
|
273
|
+
raise InvalidResponse.new(result, "invalid http status")
|
254
274
|
end
|
255
275
|
begin
|
256
276
|
obj = JSON.parse(res.content)
|
257
|
-
|
277
|
+
yield(obj)
|
278
|
+
return result
|
258
279
|
rescue JSON::ParserError => e
|
259
280
|
$stderr.puts("\e[31m[#{e.class}] #{e.message}\n#{res.content}")
|
260
|
-
return
|
281
|
+
return e
|
261
282
|
end
|
262
283
|
end
|
263
284
|
|
data/lib/libgss/version.rb
CHANGED
data/spec/libgss/network_spec.rb
CHANGED
@@ -130,8 +130,7 @@ describe Libgss::Network do
|
|
130
130
|
[300, 400, 500].map{|n| (1..10).map{|i| n + i} }.flatten.each do |status_code|
|
131
131
|
context "status_code is #{status_code}" do
|
132
132
|
before do
|
133
|
-
res = double(:reponse)
|
134
|
-
res.should_receive(:status).and_return(status_code)
|
133
|
+
res = double(:reponse, status: status_code, content: nil)
|
135
134
|
HTTPClient.any_instance.should_receive(:post).and_return(res)
|
136
135
|
end
|
137
136
|
it_should_behave_like "Libgss::Network#login failure"
|
@@ -141,9 +140,7 @@ describe Libgss::Network do
|
|
141
140
|
context "JSON parse Error" do
|
142
141
|
before do
|
143
142
|
$stderr.stub(:puts).with(an_instance_of(String)) # $stderrにメッセージが出力されます
|
144
|
-
res = double(:reponse)
|
145
|
-
res.stub(:status).and_return(200)
|
146
|
-
res.should_receive(:content).twice.and_return("invalid JSON format string")
|
143
|
+
res = double(:reponse, status: 200, content: "invalid JSON format string")
|
147
144
|
HTTPClient.any_instance.should_receive(:post).and_return(res)
|
148
145
|
end
|
149
146
|
|
@@ -242,8 +239,7 @@ describe Libgss::Network do
|
|
242
239
|
[300, 400, 500].map{|n| (1..10).map{|i| n + i} }.flatten.each do |status_code|
|
243
240
|
context "status_code is #{status_code}" do
|
244
241
|
before do
|
245
|
-
res = double(:reponse)
|
246
|
-
res.should_receive(:status).and_return(status_code)
|
242
|
+
res = double(:reponse, {status: status_code, content: nil})
|
247
243
|
HTTPClient.any_instance.should_receive(:post).and_return(res)
|
248
244
|
end
|
249
245
|
it_should_behave_like "Libgss::Network#login failure"
|
@@ -253,9 +249,7 @@ describe Libgss::Network do
|
|
253
249
|
context "JSON parse Error" do
|
254
250
|
before do
|
255
251
|
$stderr.stub(:puts).with(an_instance_of(String)) # $stderrにメッセージが出力されます
|
256
|
-
res = double(:reponse)
|
257
|
-
res.stub(:status).and_return(200)
|
258
|
-
res.should_receive(:content).twice.and_return("invalid JSON format string")
|
252
|
+
res = double(:reponse, {status: 200, content: "invalid JSON format string"})
|
259
253
|
HTTPClient.any_instance.should_receive(:post).and_return(res)
|
260
254
|
end
|
261
255
|
|
@@ -351,13 +345,13 @@ describe Libgss::Network do
|
|
351
345
|
it "with empty oauth_nonce" do
|
352
346
|
proc{
|
353
347
|
spec_with_network_options({oauth_nonce: ''})
|
354
|
-
}.should raise_error(::Libgss::
|
348
|
+
}.should raise_error(::Libgss::ErrorResponse)
|
355
349
|
end
|
356
350
|
it "with old oauth_timestamp" do
|
357
351
|
time = Time.local(2013,7,1,12,0,0)
|
358
352
|
proc{
|
359
353
|
spec_with_network_options({oauth_timestamp: time.to_i})
|
360
|
-
}.should raise_error(::Libgss::
|
354
|
+
}.should raise_error(::Libgss::ErrorResponse)
|
361
355
|
end
|
362
356
|
end
|
363
357
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe "サーバ閉塞中" do
|
5
|
+
before do
|
6
|
+
mock_res = mock(:res, {status: 503, content: "api maintenance"})
|
7
|
+
HTTPClient.any_instance.stub(:post).and_return(mock_res)
|
8
|
+
end
|
9
|
+
|
10
|
+
context "login" do
|
11
|
+
let(:network){ new_network }
|
12
|
+
it :login do
|
13
|
+
network.login_and_status.should be_a Libgss::ErrorResponse
|
14
|
+
end
|
15
|
+
it :login! do
|
16
|
+
expect{ network.login!}.to raise_error(Libgss::ServerBlockError)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context "action request" do
|
21
|
+
let(:network){ new_network }
|
22
|
+
it do
|
23
|
+
r = network.new_action_request
|
24
|
+
r.server_time
|
25
|
+
expect{ r.send_request }.to raise_error(Libgss::ServerBlockError)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: libgss
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- akima
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-12-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -215,6 +215,7 @@ files:
|
|
215
215
|
- spec/libgss/async_action_request_spec.rb
|
216
216
|
- spec/libgss/network_spec.rb
|
217
217
|
- spec/libgss/response_signatrue_spec.rb
|
218
|
+
- spec/libgss/server_block_spec.rb
|
218
219
|
- spec/protected_assets/Icon.png
|
219
220
|
- spec/public_assets/Default.png
|
220
221
|
- spec/spec_helper.rb
|
@@ -269,6 +270,7 @@ test_files:
|
|
269
270
|
- spec/libgss/async_action_request_spec.rb
|
270
271
|
- spec/libgss/network_spec.rb
|
271
272
|
- spec/libgss/response_signatrue_spec.rb
|
273
|
+
- spec/libgss/server_block_spec.rb
|
272
274
|
- spec/protected_assets/Icon.png
|
273
275
|
- spec/public_assets/Default.png
|
274
276
|
- spec/spec_helper.rb
|