phantom_proxy 1.0.0 → 1.1.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.
data/README.rdoc CHANGED
@@ -33,5 +33,12 @@ Point your browser's proxy to http://localhost:8080 for testting.
33
33
 
34
34
  You can use the Net::HTTP lib to fetch page or use the phantom_client
35
35
  (see: https://github.com/experteer/phantom_client).
36
+
37
+ Monitoring(1.1.0):
38
+ The phantom_proxy comes with a usage monitor.
39
+ You can see the current proxy status by pointing your browser to
40
+ phantom_proxy_control_panel
41
+ if you have set the proxy or just to the address and port the proxy is running at
42
+ address:port/phantom_proxy_control_panel
36
43
 
37
44
  == TODO
data/lib/phantom_proxy.rb CHANGED
@@ -3,8 +3,10 @@ require 'rubygems'
3
3
  module PhantomJSProxy
4
4
  ROOT = File.expand_path(File.dirname(__FILE__))
5
5
  SCRIPT = ROOT+"/phantom_proxy/scripts/proxy.js"
6
+ CONTROL_PANEL = ROOT+"/phantom_proxy/web/control_panel.html"
6
7
  PHANTOMJS_BIN = ROOT+'/../bin/phantomjs'
7
8
  end
8
9
 
9
10
  require PhantomJSProxy::ROOT+'/phantom_proxy/phantomjs.rb'
10
- require PhantomJSProxy::ROOT+'/phantom_proxy/phantomjsserver.rb'
11
+ require PhantomJSProxy::ROOT+'/phantom_proxy/phantomjsserver.rb'
12
+ require PhantomJSProxy::ROOT+'/phantom_proxy/phantomjs_control_panel.rb'
@@ -0,0 +1,58 @@
1
+ module PhantomJSProxy
2
+ class PhantomJSControlPanel
3
+ def initialize
4
+ @start_time = Time.new
5
+ @total_requests = 0
6
+ @special_requests = Hash.new
7
+ @special_requests.default = 0
8
+ end
9
+
10
+ attr_accessor :start_time
11
+
12
+ attr_accessor :total_requests
13
+ attr_accessor :route_requests
14
+ attr_accessor :html_requests
15
+ attr_accessor :picture_requests
16
+ attr_accessor :special_requests
17
+
18
+ def show
19
+ add_special_request "@control_requests"
20
+
21
+ resp = Rack::Response.new([], 200, {
22
+ 'Content-Type' => 'text/html'
23
+ }) { |r|
24
+ r.write(load_html)
25
+ }
26
+ resp.finish
27
+ end
28
+
29
+ def add_request
30
+ @total_requests = @total_requests+1
31
+ end
32
+
33
+ def add_special_request type
34
+ @special_requests[type] = @special_requests[type]+1
35
+ end
36
+
37
+ private
38
+ def load_html
39
+ insert_value IO.read(CONTROL_PANEL)
40
+ end
41
+
42
+ def insert_value html
43
+ info_data = ""
44
+ info_data << create_entry("Running since", start_time.ctime)
45
+ info_data << create_entry("Total requests", total_requests.to_s)
46
+ special_requests.each { |key, value|
47
+ info_data << create_entry(key, special_requests[key].to_s)
48
+ }
49
+ html["@control_panel_data"] = info_data
50
+
51
+ html
52
+ end
53
+
54
+ def create_entry name, value
55
+ "<div class='name'>#{name}:</div><div class='value' id='#{name}'>#{value}</div><div class='divider'></div>"
56
+ end
57
+ end
58
+ end
@@ -3,7 +3,10 @@ require 'net/http'
3
3
  module PhantomJSProxy
4
4
  class PhantomJSServer
5
5
  def initialize()
6
+ @control_panel = PhantomJSProxy::PhantomJSControlPanel.new
6
7
  end
8
+
9
+ attr_accessor :control_panel
7
10
 
8
11
  def check_for_route(url)
9
12
  if /\.js/i.match(url)
@@ -15,6 +18,9 @@ module PhantomJSProxy
15
18
  if /\.png/i.match(url) or /\.jpg/i.match(url) or /\.jpeg/i.match(url) or /\.gif/i.match(url)
16
19
  return 'image/*';
17
20
  end
21
+ if /phantom_proxy_control_panel/.match(url)
22
+ return 'control_panel'
23
+ end
18
24
  "none"
19
25
  end
20
26
 
@@ -37,6 +43,8 @@ module PhantomJSProxy
37
43
  end
38
44
 
39
45
  def call(env)
46
+ control_panel.add_request
47
+
40
48
  req = Rack::Request.new(env)
41
49
 
42
50
  haha = env.collect { |k, v| "#{k} : #{v}\n" }.join
@@ -47,58 +55,68 @@ module PhantomJSProxy
47
55
 
48
56
  #this routes the request to the outgoing server incase its not html that we want to load
49
57
  type = check_for_route(env['REQUEST_URI'])
50
- if type != "none"
51
- return route(env, type)
52
- end
53
-
54
-
55
- #Fetch the Webpage with PhantomJS
56
- phJS = PhantomJS.new
57
-
58
- env['rack.errors'].write("Extract the uri\n")
59
-
60
- if defined? env['HTTP_GET_PAGE_AS_IMAGE']
61
- picture = env['HTTP_GET_PAGE_AS_IMAGE']
62
- else
63
- picture = true
58
+ if type == "control_panel"
59
+ return control_panel.show()
60
+ elsif type != "none"
61
+ control_panel.add_special_request "@forward_requests"
62
+ return route(env, type)
63
+ else
64
+ #Fetch the Webpage with PhantomJS
65
+ phJS = PhantomJS.new
66
+
67
+ env['rack.errors'].write("Extract the uri\n")
68
+
69
+ if defined? env['HTTP_GET_PAGE_AS_IMAGE']
70
+ picture = env['HTTP_GET_PAGE_AS_IMAGE']
71
+ else
72
+ picture = true
73
+ end
74
+
75
+ if defined? env['HTTP_GET_PAGE_WITH_IFRAMES']
76
+ loadFrames = env['HTTP_GET_PAGE_WITH_IFRAMES']
77
+ else
78
+ loadFrames = false
79
+ end
80
+
81
+ url = env['REQUEST_URI'];
82
+ if params.length > 0
83
+ url += '?'+params;
84
+ end
85
+
86
+ phJS.getUrl(url, picture, loadFrames)
87
+
88
+ #Create the response
89
+ if !phJS.ready
90
+ if !/favicon\.ico/.match(req.url())
91
+ env['rack.errors'].write("Request FAILED\n")
92
+ control_panel.add_special_request "@failed_requests"
93
+ else
94
+ control_panel.add_special_request "@favicon_requests"
95
+ end
96
+ resp = Rack::Response.new([], 503, {
97
+ 'Content-Type' => 'text/html'
98
+ }) { |r|
99
+ r.write(phJS.dom)
100
+ }
101
+ resp.finish
102
+ elsif picture
103
+ control_panel.add_special_request "@image_requests"
104
+ resp = Rack::Response.new([], 200, {
105
+ 'Content-Type' => 'image/png'
106
+ }) { |r|
107
+ r.write(phJS.image)
108
+ }
109
+ resp.finish
110
+ else
111
+ control_panel.add_special_request "@html_requests"
112
+ resp = Rack::Response.new([], 200, {
113
+ 'Content-Type' => 'text/html'
114
+ }) { |r|
115
+ r.write(phJS.dom)
116
+ }
117
+ resp.finish
118
+ end
64
119
  end
65
-
66
- if defined? env['HTTP_GET_PAGE_WITH_IFRAMES']
67
- loadFrames = env['HTTP_GET_PAGE_WITH_IFRAMES']
68
- else
69
- loadFrames = false
70
- end
71
-
72
- url = env['REQUEST_URI'];
73
- if params.length > 0
74
- url += '?'+params;
75
- end
76
-
77
- phJS.getUrl(url, picture, loadFrames)
78
-
79
- #Create the response
80
- if !phJS.ready
81
- resp = Rack::Response.new([], 503, {
82
- 'Content-Type' => 'text/html'
83
- }) { |r|
84
- r.write(phJS.dom)
85
- }
86
- resp.finish
87
- elsif picture
88
- resp = Rack::Response.new([], 200, {
89
- 'Content-Type' => 'image/png'
90
- }) { |r|
91
- r.write(phJS.image)
92
- }
93
- resp.finish
94
- else
95
- resp = Rack::Response.new([], 200, {
96
- 'Content-Type' => 'text/html'
97
- }) { |r|
98
- r.write(phJS.dom)
99
- }
100
- resp.finish
101
- end
102
120
  end
103
121
  end
104
122
  end
@@ -0,0 +1,44 @@
1
+ <html>
2
+ <head>
3
+ <title>Phantom Proxy Control</title>
4
+ <style>
5
+ h1 {
6
+ text-align: center;
7
+ }
8
+ h4 {
9
+ text-align: center;
10
+ position: relative;
11
+ top: -20px;
12
+ }
13
+ .infobox {
14
+ width: 800px;
15
+ margin-left: auto;
16
+ margin-right: auto;
17
+ }
18
+ .name {
19
+ float: left;
20
+ }
21
+ .value {
22
+ float: right;
23
+ margin-bottom: 10px;
24
+ }
25
+ .divider {
26
+ background-color: black;
27
+ height: 1px;
28
+ width: 700px;
29
+ margin-bottom: 10px;
30
+ margin-left: auto;
31
+ margin-right: auto;
32
+ clear: left;
33
+ clear: right;
34
+ }
35
+ </style>
36
+ </head>
37
+ <body>
38
+ <h1>Phantom Proxy</h1>
39
+ <h4>Control Panel</h4>
40
+ <div class="infobox" id="infobox">
41
+ @control_panel_data
42
+ </div>
43
+ </body>
44
+ </html>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phantom_proxy
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-23 00:00:00.000000000 Z
12
+ date: 2012-04-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thin
@@ -36,10 +36,12 @@ extensions: []
36
36
  extra_rdoc_files: []
37
37
  files:
38
38
  - lib/phantom_proxy/phantomjsserver.rb
39
+ - lib/phantom_proxy/phantomjs_control_panel.rb
39
40
  - lib/phantom_proxy/phantomjs.rb
40
41
  - lib/phantom_proxy.rb
41
42
  - lib/phantom_proxy/scripts/proxy.js
42
43
  - lib/phantom_proxy/config.ru
44
+ - lib/phantom_proxy/web/control_panel.html
43
45
  - bin/phantom_proxy
44
46
  - bin/phantomjs
45
47
  - README.rdoc