thrift_rack 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8571e71f5bd664d42b6bb98cebd08bbd1226ebcc
4
- data.tar.gz: 1f15614f521e256d8c3d2728eedcd115949e4c4a
3
+ metadata.gz: c273d19fb145e13d95492d12e9d2d132ad3034cc
4
+ data.tar.gz: 2ad194479ccb84197c6976e776779d398ac2bede
5
5
  SHA512:
6
- metadata.gz: ba3f159d77c44e1bd3f31d5497dd5c86535fcdfa3d4b90843fa71c145026d4a4bbfb6e1540ab8e57995c97c962f36a16d6fc777db19682e71bf0cfe5a24f5539
7
- data.tar.gz: a7bbcaa16095861818690e657259bcbb30d449b51783e37bb23773552505dba76777d201aa218bd714bb9d31d718a3236135ee9af8774a3a1364e16b4dc14d94
6
+ metadata.gz: dc091bdbeb0a9463ddb0a4c7cf32020d8eab74f495097207d230f22ad49b3277b717c311485f2340859ba0aa65d1ec854eb88f12e65a40cb05204f15cc559e8a
7
+ data.tar.gz: 0581140e263a3eb43ae57cc59dc2e3f8baecb0d2fc398ceebeb7bbfae96bbd396f9087101941da522ce32234d415809f4cdda4734fca36fb02afc7903d34a0f2
data/.gitignore CHANGED
@@ -7,4 +7,4 @@
7
7
  /spec/reports/
8
8
  /tmp/
9
9
  /bin/
10
- thrift_rack-0.1.0.gem
10
+ *.gem
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- thrift_rack (0.1.0)
4
+ thrift_rack (0.1.1)
5
5
  rack (>= 2.0)
6
6
  thrift (~> 0.10.0)
7
7
 
data/lib/thrift_rack.rb CHANGED
@@ -1,9 +1,13 @@
1
1
  require "thrift_rack/version"
2
2
  require "thrift_rack/server"
3
+ require "thrift_rack/logger"
4
+ require "thrift_rack/client"
5
+ require 'thrift_rack/ping'
6
+ require 'thrift_rack/format_check'
7
+
3
8
  require 'rack'
4
9
  require 'thrift'
5
10
 
6
-
7
11
  class ThriftRack
8
12
  THRIFT_HEADER = "application/x-thrift"
9
13
 
@@ -17,10 +21,6 @@ class ThriftRack
17
21
 
18
22
  def call(env)
19
23
  req = Rack::Request.new(env)
20
- return Rack::Response.new(["PONG"], 200, {'Content-Type' => 'text/plain'}) if req.path == "/ping"
21
-
22
- return Rack::Response.new(["Not Valid Thrift Request"], 400, {'Content-Type' => 'text/plain'}) unless req.post? && req.env["CONTENT_TYPE"] == THRIFT_HEADER
23
-
24
24
  server_class = @maps[req.path]
25
25
  return Rack::Response.new(["No Thrift Server For #{req.path}"], 404, {'Content-Type' => 'text/plain'}) unless server_class
26
26
 
@@ -35,9 +35,9 @@ class ThriftRack
35
35
 
36
36
  def self.app(servers = nil)
37
37
  Rack::Builder.new(ThriftRack.new(servers)) do
38
- use Rack::CommonLogger
39
- use Rack::ShowExceptions
40
- use Rack::Lint
38
+ use ThriftRack::Ping
39
+ use ThriftRack::FormatCheck
40
+ use ThriftRack::Logger
41
41
  end
42
42
  end
43
43
  end
@@ -0,0 +1,60 @@
1
+ require 'thrift'
2
+ require 'securerandom'
3
+ class ThriftRack
4
+ class Client
5
+ def initialize(url, client_klass, request_id)
6
+ @rpc_id = SecureRandom.uuid
7
+ @request_id = request_id
8
+ @url = url
9
+ @transport = Thrift::HTTPClientTransport.new(url, ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE)
10
+ @transport.add_headers({"X-Request-ID" => @request_id, "X-Rpc-ID" => @rpc_id})
11
+ protocol = protocol_factory.get_protocol(@transport)
12
+ @client = client_klass.new(protocol)
13
+
14
+ end
15
+
16
+ def logger
17
+ @logger ||= (defined? Rails) ? rails_logger : std_logger
18
+ end
19
+
20
+ def protocol_factory
21
+ Thrift::CompactProtocolFactory.new
22
+ end
23
+
24
+ def method_missing(method, *params)
25
+ return super unless @client.respond_to?(method)
26
+ self.class_eval do
27
+ define_method method.to_sym do |*args|
28
+ begin
29
+ request_at = Time.now
30
+ @transport.add_headers({"X-Rpc-Func" => method.to_s})
31
+ @client.send(method, *args)
32
+ ensure
33
+ end_time = Time.now
34
+ self.logger.info(JSON.dump({
35
+ request_at: request_at.iso8601,
36
+ request_id: @request_id,
37
+ rpc_id: @rpc_id,
38
+ duration: ((end_time - request_at) * 1000).round(4),
39
+ path: URI(@url).path,
40
+ func: method,
41
+ }))
42
+ end
43
+ end
44
+ end
45
+ self.public_send(method, *params)
46
+ end
47
+
48
+ private
49
+
50
+ def rails_logger
51
+ file = File.open("#{Rails.root}/log/rpc_client.log", File::WRONLY | File::APPEND | File::CREAT)
52
+ file.sync = true
53
+ ActiveSupport::Logger.new(file)
54
+ end
55
+
56
+ def std_logger
57
+ ::Logger.new(STDOUT)
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,13 @@
1
+ class ThriftRack
2
+ class FormatCheck
3
+ def initialize(app)
4
+ @app = app
5
+ end
6
+
7
+ def call(env)
8
+ req = Rack::Request.new(env)
9
+ return Rack::Response.new(["Not Valid Thrift Request"], 400, {'Content-Type' => 'text/plain'}) unless req.post? && req.env["CONTENT_TYPE"] == THRIFT_HEADER
10
+ @app.call(env)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,42 @@
1
+ require 'logger'
2
+ require 'json'
3
+ class ThriftRack
4
+ class Logger
5
+ def initialize(app)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ request_at = Time.now
11
+ req = Rack::Request.new(env)
12
+ resp = @app.call(env)
13
+ resp
14
+ ensure
15
+ end_time = Time.now
16
+ self.logger.info(JSON.dump({
17
+ request_at: request_at.iso8601,
18
+ request_id: req.env["HTTP_X_REQUEST_ID"],
19
+ rpc_id: req.env["HTTP_X_RPC_ID"],
20
+ duration: ((end_time - request_at) * 1000).round(4),
21
+ path: req.path,
22
+ func: req.env["HTTP_X_RPC_FUNC"],
23
+ }))
24
+ end
25
+
26
+ def logger
27
+ @logger ||= (defined? Rails) ? rails_logger : std_logger
28
+ end
29
+
30
+ private
31
+
32
+ def rails_logger
33
+ file = File.open("#{Rails.root}/log/rpc.log", File::WRONLY | File::APPEND | File::CREAT)
34
+ file.sync = true
35
+ ActiveSupport::Logger.new(file)
36
+ end
37
+
38
+ def std_logger
39
+ ::Logger.new(STDOUT)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,13 @@
1
+ class ThriftRack
2
+ class Ping
3
+ def initialize(app)
4
+ @app = app
5
+ end
6
+
7
+ def call(env)
8
+ req = Rack::Request.new(env)
9
+ return Rack::Response.new(["PONG"], 200, {'Content-Type' => 'text/plain'}) if req.path == "/ping"
10
+ @app.call(env)
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  class ThriftRack
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thrift_rack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - xuxiangyang
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-04-24 00:00:00.000000000 Z
11
+ date: 2018-04-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -96,6 +96,10 @@ files:
96
96
  - Rakefile
97
97
  - config.ru
98
98
  - lib/thrift_rack.rb
99
+ - lib/thrift_rack/client.rb
100
+ - lib/thrift_rack/format_check.rb
101
+ - lib/thrift_rack/logger.rb
102
+ - lib/thrift_rack/ping.rb
99
103
  - lib/thrift_rack/server.rb
100
104
  - lib/thrift_rack/version.rb
101
105
  - thrift_rack.gemspec