seo4ajax_rails 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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/seo4ajax_rails.rb +154 -0
  3. metadata +73 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 182eec52dc5bf9573357fbc29404a50dadd0094a
4
+ data.tar.gz: 7890a986393cef772426937ae9f914142f93360a
5
+ SHA512:
6
+ metadata.gz: 5bf2948ce61acf3fb41f769cc4ccb0fde3aefe07bc0ac4e8bb7d40558a41e07a85cc5990391d5317ba2ddf0fa9e06decd17785bb1e01f310e770866d0cdb537a
7
+ data.tar.gz: 0338dd458eda203b20d2266189d79e6813f499fdacbd1c6a38c35b7acfb0120b485262822c389ec71c27f7dbeb09fc1ae7e6a834872bad1cbd338104fcb0ff1f
@@ -0,0 +1,154 @@
1
+ module Rack
2
+ class SEO4Ajax
3
+ require 'net/http'
4
+ require 'active_support'
5
+
6
+ def initialize(app, options={})
7
+ # googlebot, yahoo, and bingbot are not in this list because
8
+ # we support _escaped_fragment_ and want to ensure people aren't
9
+ # penalized for cloaking.
10
+ @crawler_user_agents = [
11
+ # 'googlebot',
12
+ # 'yahoo',
13
+ # 'bingbot',
14
+ 'baiduspider',
15
+ 'facebookexternalhit',
16
+ 'twitterbot',
17
+ 'rogerbot',
18
+ 'linkedinbot',
19
+ 'embedly',
20
+ 'bufferbot',
21
+ 'quora link preview',
22
+ 'showyoubot',
23
+ 'outbrain',
24
+ 'pinterest/0.',
25
+ 'developers.google.com/+/web/snippet',
26
+ 'www.google.com/webmasters/tools/richsnippets',
27
+ 'slackbot',
28
+ 'vkShare',
29
+ 'W3C_Validator',
30
+ 'redditbot',
31
+ 'Applebot',
32
+ 'WhatsApp',
33
+ 'flipboard',
34
+ 'tumblr',
35
+ 'bitlybot',
36
+ 'SkypeUriPreview',
37
+ 'nuzzel',
38
+ 'Discordbot',
39
+ 'Google Page Speed',
40
+ 'Qwantify'
41
+ ]
42
+
43
+ @extensions_to_ignore = [
44
+ '.js',
45
+ '.css',
46
+ '.xml',
47
+ '.less',
48
+ '.png',
49
+ '.jpg',
50
+ '.jpeg',
51
+ '.gif',
52
+ '.pdf',
53
+ '.doc',
54
+ '.txt',
55
+ '.ico',
56
+ '.rss',
57
+ '.zip',
58
+ '.mp3',
59
+ '.rar',
60
+ '.exe',
61
+ '.wmv',
62
+ '.doc',
63
+ '.avi',
64
+ '.ppt',
65
+ '.mpg',
66
+ '.mpeg',
67
+ '.tif',
68
+ '.wav',
69
+ '.mov',
70
+ '.psd',
71
+ '.ai',
72
+ '.xls',
73
+ '.mp4',
74
+ '.m4a',
75
+ '.swf',
76
+ '.dat',
77
+ '.dmg',
78
+ '.iso',
79
+ '.flv',
80
+ '.m4v',
81
+ '.torrent'
82
+ ]
83
+
84
+ @options = options
85
+ @extensions_to_ignore = @options[:extensions_to_ignore] if @options[:extensions_to_ignore]
86
+ @crawler_user_agents = @options[:crawler_user_agents] if @options[:crawler_user_agents]
87
+ @app = app
88
+ end
89
+
90
+
91
+ def call(env)
92
+ if should_show_snapshot(env)
93
+ snapshot = get_snapshot_response(env)
94
+ if snapshot
95
+ response = build_rack_response_from_seo4ajax(snapshot)
96
+ return response.finish
97
+ end
98
+ end
99
+ @app.call(env)
100
+ end
101
+
102
+
103
+ def should_show_snapshot(env)
104
+ user_agent = env['HTTP_USER_AGENT']
105
+ is_requesting_snapshot = false
106
+ return false if !user_agent
107
+ return false if env['REQUEST_METHOD'] != 'GET'
108
+ request = Rack::Request.new(env)
109
+ is_requesting_snapshot = true if Rack::Utils.parse_query(request.query_string).has_key?('_escaped_fragment_')
110
+ is_requesting_snapshot = true if @crawler_user_agents.any? { |crawler_user_agent| user_agent.downcase.include?(crawler_user_agent.downcase) }
111
+ return false if @extensions_to_ignore.any? { |extension| request.fullpath.include? extension }
112
+ return is_requesting_snapshot
113
+ end
114
+
115
+
116
+ def get_snapshot_response(env)
117
+ begin
118
+ url = URI.parse(build_api_url(env))
119
+ headers = {
120
+ 'User-Agent' => env['HTTP_USER_AGENT'],
121
+ 'Accept-Encoding' => 'gzip'
122
+ }
123
+ req = Net::HTTP::Get.new(url.request_uri, headers)
124
+ http = Net::HTTP.new(url.host, url.port)
125
+ http.use_ssl = true if url.scheme == 'https'
126
+ response = http.request(req)
127
+ if response['Content-Encoding'] == 'gzip'
128
+ response.body = ActiveSupport::Gzip.decompress(response.body)
129
+ response['Content-Length'] = response.body.length
130
+ response.delete('Content-Encoding')
131
+ response.delete('Transfer-Encoding')
132
+ end
133
+ response
134
+ rescue
135
+ nil
136
+ end
137
+ end
138
+
139
+
140
+ def build_api_url(env)
141
+ fullpath = Rack::Request.new(env).fullpath
142
+ seo4ajax_url = @options[:seo4ajax_service_url] || ENV['SEO4AJAX_SERVICE_URL'] || 'http://api.seo4ajax.com/'
143
+ forward_slash = seo4ajax_url[-1, 1] == '/' ? '' : '/'
144
+ token = ENV['SEO4AJAX_TOKEN'] if ENV['SEO4AJAX_TOKEN']
145
+ token = @options[:seo4ajax_token] if @options[:seo4ajax_token]
146
+ "#{seo4ajax_url}#{forward_slash}#{token}#{fullpath}"
147
+ end
148
+
149
+
150
+ def build_rack_response_from_seo4ajax(snapshot)
151
+ Rack::Response.new(snapshot.body, snapshot.code, snapshot.header)
152
+ end
153
+ end
154
+ end
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: seo4ajax_rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - SEO4Ajax
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-06-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Rails middleware to integrate SEO4Ajax in your web application
42
+ email:
43
+ - support@seo4ajax.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - lib/seo4ajax_rails.rb
49
+ homepage: https://github.com/seo4ajax/seo4ajax_rails
50
+ licenses:
51
+ - MIT
52
+ metadata: {}
53
+ post_install_message:
54
+ rdoc_options: []
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ requirements: []
68
+ rubyforge_project:
69
+ rubygems_version: 2.4.5.2
70
+ signing_key:
71
+ specification_version: 4
72
+ summary: Use SEO4Ajax to serve prerendered pages to bots
73
+ test_files: []