erichummel-sunspot 1.2.1g → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. data/.gitignore +12 -0
  2. data/Gemfile +3 -9
  3. data/Rakefile +11 -5
  4. data/lib/sunspot/dsl/field_query.rb +13 -0
  5. data/lib/sunspot/dsl/functional.rb +3 -0
  6. data/lib/sunspot/search/abstract_search.rb +9 -12
  7. data/lib/sunspot/search/paginated_collection.rb +55 -0
  8. data/lib/sunspot/server.rb +3 -7
  9. data/lib/sunspot/version.rb +1 -1
  10. data/script/console +10 -0
  11. data/solr-1.3/etc/jetty.xml +212 -0
  12. data/solr-1.3/etc/webdefault.xml +379 -0
  13. data/solr-1.3/lib/jetty-6.1.3.jar +0 -0
  14. data/solr-1.3/lib/jetty-util-6.1.3.jar +0 -0
  15. data/solr-1.3/lib/jsp-2.1/ant-1.6.5.jar +0 -0
  16. data/solr-1.3/lib/jsp-2.1/core-3.1.1.jar +0 -0
  17. data/solr-1.3/lib/jsp-2.1/jsp-2.1.jar +0 -0
  18. data/solr-1.3/lib/jsp-2.1/jsp-api-2.1.jar +0 -0
  19. data/solr-1.3/lib/servlet-api-2.5-6.1.3.jar +0 -0
  20. data/solr-1.3/solr/conf/elevate.xml +36 -0
  21. data/solr-1.3/solr/conf/protwords.txt +21 -0
  22. data/solr-1.3/solr/conf/schema.xml +64 -0
  23. data/solr-1.3/solr/conf/solrconfig.xml +725 -0
  24. data/solr-1.3/solr/conf/stopwords.txt +57 -0
  25. data/solr-1.3/solr/conf/synonyms.txt +31 -0
  26. data/solr-1.3/solr/lib/geoapi-nogenerics-2.1-M2.jar +0 -0
  27. data/solr-1.3/solr/lib/gt2-referencing-2.3.1.jar +0 -0
  28. data/solr-1.3/solr/lib/jsr108-0.01.jar +0 -0
  29. data/solr-1.3/solr/lib/locallucene.jar +0 -0
  30. data/solr-1.3/solr/lib/localsolr.jar +0 -0
  31. data/solr-1.3/start.jar +0 -0
  32. data/solr-1.3/webapps/solr.war +0 -0
  33. data/solr/README.txt +42 -0
  34. data/solr/etc/jetty.xml +4 -0
  35. data/solr/solr/.gitignore +1 -0
  36. data/solr/solr/README.txt +54 -0
  37. data/solr/solr/conf/xslt/example.xsl +132 -0
  38. data/solr/solr/conf/xslt/example_atom.xsl +67 -0
  39. data/solr/solr/conf/xslt/example_rss.xsl +66 -0
  40. data/solr/solr/conf/xslt/luke.xsl +337 -0
  41. data/spec/api/adapters_spec.rb +1 -1
  42. data/spec/api/binding_spec.rb +1 -1
  43. data/spec/api/indexer/attributes_spec.rb +1 -1
  44. data/spec/api/indexer/batch_spec.rb +1 -1
  45. data/spec/api/indexer/dynamic_fields_spec.rb +1 -1
  46. data/spec/api/indexer/fixed_fields_spec.rb +1 -1
  47. data/spec/api/indexer/fulltext_spec.rb +1 -1
  48. data/spec/api/indexer/removal_spec.rb +1 -1
  49. data/spec/api/indexer/spec_helper.rb +1 -1
  50. data/spec/api/indexer_spec.rb +1 -1
  51. data/spec/api/query/advanced_manipulation_examples.rb +1 -1
  52. data/spec/api/query/dsl_spec.rb +1 -1
  53. data/spec/api/query/faceting_examples.rb +0 -2
  54. data/spec/api/query/fulltext_examples.rb +0 -2
  55. data/spec/api/query/function_spec.rb +1 -1
  56. data/spec/api/query/geo_examples.rb +0 -1
  57. data/spec/api/query/highlighting_examples.rb +0 -2
  58. data/spec/api/query/more_like_this_spec.rb +1 -1
  59. data/spec/api/query/ordering_pagination_examples.rb +0 -2
  60. data/spec/api/query/spec_helper.rb +1 -1
  61. data/spec/api/query/standard_spec.rb +1 -1
  62. data/spec/api/search/dynamic_fields_spec.rb +1 -1
  63. data/spec/api/search/faceting_spec.rb +1 -1
  64. data/spec/api/search/highlighting_spec.rb +1 -1
  65. data/spec/api/search/hits_spec.rb +12 -32
  66. data/spec/api/search/paginated_collection_spec.rb +26 -0
  67. data/spec/api/search/results_spec.rb +6 -19
  68. data/spec/api/search/search_spec.rb +1 -1
  69. data/spec/api/search/spec_helper.rb +1 -1
  70. data/spec/api/server_spec.rb +1 -1
  71. data/spec/api/session_proxy/class_sharding_session_proxy_spec.rb +1 -1
  72. data/spec/api/session_proxy/id_sharding_session_proxy_spec.rb +1 -1
  73. data/spec/api/session_proxy/master_slave_session_proxy_spec.rb +1 -1
  74. data/spec/api/session_proxy/sharding_session_proxy_spec.rb +1 -1
  75. data/spec/api/session_proxy/silent_fail_session_proxy_spec.rb +1 -1
  76. data/spec/api/session_proxy/spec_helper.rb +1 -1
  77. data/spec/api/session_proxy/thread_local_session_proxy_spec.rb +1 -1
  78. data/spec/api/session_spec.rb +1 -1
  79. data/spec/api/spec_helper.rb +1 -1
  80. data/spec/api/sunspot_spec.rb +1 -1
  81. data/spec/integration/faceting_spec.rb +1 -1
  82. data/spec/integration/indexing_spec.rb +1 -1
  83. data/spec/integration/keyword_search_spec.rb +1 -1
  84. data/spec/integration/local_search_spec.rb +1 -1
  85. data/spec/integration/more_like_this_spec.rb +1 -1
  86. data/spec/integration/scoped_search_spec.rb +1 -1
  87. data/spec/integration/spec_helper.rb +1 -1
  88. data/spec/integration/test_pagination.rb +1 -1
  89. data/spec/mocks/connection.rb +1 -1
  90. data/spec/spec_helper.rb +4 -16
  91. metadata +118 -37
  92. data/Gemfile.lock +0 -32
@@ -0,0 +1,12 @@
1
+ sunspot-solr.pid
2
+ *.swp
3
+ coverage
4
+ pkg
5
+ /doc
6
+ .DS_Store
7
+
8
+ .yardoc
9
+ sunspot.gemspec
10
+ README.rdoc
11
+ .bundle
12
+ Gemfile.lock
data/Gemfile CHANGED
@@ -1,10 +1,4 @@
1
- source :rubygems
1
+ source "http://rubygems.org"
2
2
 
3
- require File.expand_path('../lib/sunspot/version', __FILE__)
4
-
5
- gem 'sunspot', Sunspot::VERSION, :path => File.expand_path('..', __FILE__)
6
-
7
- group :test do
8
- gem 'rspec', '~> 1.3'
9
- gem 'ruby-debug'
10
- end
3
+ # Specify your gem's dependencies in carrierwave_backgrounder.gemspec
4
+ gemspec
data/Rakefile CHANGED
@@ -1,11 +1,17 @@
1
1
  ENV['RUBYOPT'] = '-W1'
2
2
 
3
- task :environment do
4
- require File.dirname(__FILE__) + '/lib/sunspot'
5
- end
3
+ # encoding: UTF-8
4
+ require 'bundler'
5
+ Bundler::GemHelper.install_tasks
6
6
 
7
- require File.join(File.dirname(__FILE__), 'lib', 'sunspot', 'version')
7
+ require 'spec/rake/spectask'
8
8
 
9
9
  Dir['tasks/**/*.rake'].each { |t| load t }
10
10
 
11
- task :default => 'spec:api'
11
+ desc "Run all examples"
12
+ Spec::Rake::SpecTask.new(:spec) do |t|
13
+ t.spec_files = Dir.glob('spec/**/*_spec.rb')
14
+ t.spec_opts << '--format specdoc'
15
+ end
16
+
17
+ task :default => 'spec'
@@ -84,6 +84,19 @@ module Sunspot
84
84
  # with a category_id of 2, the category_id facet will operate as if a
85
85
  # category had not been selected, allowing the user to select additional
86
86
  # categories (which will presumably be ORed together).
87
+ #
88
+ # It possible to exclude multiple filters by passing an array:
89
+ #
90
+ # Sunspot.search(Post) do
91
+ # with(:blog_id, 1)
92
+ # category_filter = with(:category_id, 2)
93
+ # author_filter = with(:author_id, 3)
94
+ # facet(:category_id,
95
+ # :exclude => [category_filter, author_filter].compact)
96
+ # end
97
+ #
98
+ # You should consider using +.compact+ to ensure that the array does not
99
+ # contain any nil values.
87
100
  #
88
101
  # <strong>As far as I can tell, Solr only supports multi-select with
89
102
  # field facets; if +:exclude+ is passed to a query facet, this method will
@@ -14,6 +14,9 @@ module Sunspot
14
14
  # function { :average_rating }
15
15
  # function { sum(:average_rating, 10) }
16
16
  #
17
+ # See http://wiki.apache.org/solr/FunctionQuery for a list of all
18
+ # applicable functions
19
+ #
17
20
  def function(&block)
18
21
  expression = Sunspot::Util.instance_eval_or_call(
19
22
  Function.new(self),
@@ -1,5 +1,8 @@
1
+ require 'sunspot/search/paginated_collection'
2
+
1
3
  module Sunspot
2
4
  module Search #:nodoc:
5
+
3
6
  #
4
7
  # This class encapsulates the results of a Solr search. It provides access
5
8
  # to search results, total result count, facets, and pagination information.
@@ -32,7 +35,7 @@ module Sunspot
32
35
  def execute
33
36
  reset
34
37
  params = @query.to_params
35
- @solr_result = @connection.request("/#{request_handler}", params)
38
+ @solr_result = @connection.request("/#{request_handler}", params, {:header => {'Content-Type' => 'application/x-www-form-urlencoded'}})
36
39
  self
37
40
  end
38
41
 
@@ -53,7 +56,7 @@ module Sunspot
53
56
  # WillPaginate::Collection or Array:: Instantiated result objects
54
57
  #
55
58
  def results
56
- @results ||= maybe_will_paginate(verified_hits.map { |hit| hit.instance })
59
+ @results ||= paginate_collection(verified_hits.map { |hit| hit.instance })
57
60
  end
58
61
 
59
62
  #
@@ -84,7 +87,7 @@ module Sunspot
84
87
  Hit.new(doc, highlights_for(doc), self)
85
88
  end
86
89
  end
87
- maybe_will_paginate(hits || [])
90
+ paginate_collection(hits || [])
88
91
  end
89
92
  end
90
93
  end
@@ -269,17 +272,11 @@ module Sunspot
269
272
  end
270
273
 
271
274
  def verified_hits
272
- @verified_hits ||= maybe_will_paginate(hits.select { |hit| hit.instance })
275
+ @verified_hits ||= paginate_collection(hits.select { |hit| hit.instance })
273
276
  end
274
277
 
275
- def maybe_will_paginate(collection)
276
- if defined?(WillPaginate::Collection)
277
- WillPaginate::Collection.create(@query.page, @query.per_page, total) do |pager|
278
- pager.replace(collection)
279
- end
280
- else
281
- collection
282
- end
278
+ def paginate_collection(collection)
279
+ PaginatedCollection.new(collection, @query.page, @query.per_page, total)
283
280
  end
284
281
 
285
282
  def add_facet(name, facet)
@@ -0,0 +1,55 @@
1
+ module Sunspot
2
+ module Search
3
+
4
+ class PaginatedCollection
5
+ instance_methods.each { |m| undef_method m unless m =~ /^__|instance_eval|object_id/ }
6
+
7
+ attr_reader :total_count, :current_page, :per_page
8
+ alias :total_entries :total_count
9
+ alias :limit_value :per_page
10
+
11
+ def initialize(collection, page, per_page, total)
12
+ @collection = collection
13
+ @current_page = page
14
+ @per_page = per_page
15
+ @total_count = total
16
+ end
17
+
18
+ def total_pages
19
+ (total_count.to_f / per_page).ceil
20
+ end
21
+ alias :num_pages :total_pages
22
+
23
+ def first_page?
24
+ current_page == 1
25
+ end
26
+
27
+ def last_page?
28
+ current_page >= total_pages
29
+ end
30
+
31
+ def previous_page
32
+ current_page > 1 ? (current_page - 1) : nil
33
+ end
34
+
35
+ def next_page
36
+ current_page < total_pages ? (current_page + 1) : nil
37
+ end
38
+
39
+ def out_of_bounds?
40
+ current_page > total_pages
41
+ end
42
+
43
+ def offset
44
+ (current_page - 1) * per_page
45
+ end
46
+
47
+ private
48
+
49
+ def method_missing(method, *args, &block)
50
+ @collection.send(method, *args, &block)
51
+ end
52
+
53
+ end
54
+ end
55
+ end
@@ -16,7 +16,7 @@ module Sunspot
16
16
 
17
17
  LOG_LEVELS = Set['SEVERE', 'WARNING', 'INFO', 'CONFIG', 'FINE', 'FINER', 'FINEST']
18
18
 
19
- attr_accessor :min_memory, :max_memory, :port, :solr_data_dir, :solr_home, :log_file, :multicore
19
+ attr_accessor :min_memory, :max_memory, :port, :solr_data_dir, :solr_home, :log_file
20
20
  attr_writer :pid_dir, :pid_file, :log_level, :solr_data_dir, :solr_home, :solr_jar
21
21
 
22
22
  #
@@ -66,7 +66,7 @@ module Sunspot
66
66
  command << "-Xms#{min_memory}" if min_memory
67
67
  command << "-Xmx#{max_memory}" if max_memory
68
68
  command << "-Djetty.port=#{port}" if port
69
- command << "-Dsolr.data.dir=#{solr_data_dir}" if solr_data_dir && !multicore
69
+ command << "-Dsolr.data.dir=#{solr_data_dir}" if solr_data_dir
70
70
  command << "-Dsolr.solr.home=#{solr_home}" if solr_home
71
71
  command << "-Djava.util.logging.config.file=#{logging_config_path}" if logging_config_path
72
72
  command << '-jar' << File.basename(solr_jar)
@@ -131,11 +131,7 @@ module Sunspot
131
131
  def solr_jar
132
132
  @solr_jar || SOLR_START_JAR
133
133
  end
134
-
135
- def multicore
136
- @multicore || false
137
- end
138
-
134
+
139
135
  private
140
136
 
141
137
  def logging_config_path
@@ -1,3 +1,3 @@
1
1
  module Sunspot
2
- VERSION = '1.2.1g'
2
+ VERSION = '1.2.1'
3
3
  end
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ require 'irb'
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ Bundler.setup(:default, :test)
6
+ require 'sunspot'
7
+ def test_env!
8
+ require File.join(File.dirname(__FILE__), '..', 'spec', 'integration', 'spec_helper')
9
+ end
10
+ IRB.start
@@ -0,0 +1,212 @@
1
+ <?xml version="1.0"?>
2
+ <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
3
+
4
+ <!-- =============================================================== -->
5
+ <!-- Configure the Jetty Server -->
6
+ <!-- -->
7
+ <!-- Documentation of this file format can be found at: -->
8
+ <!-- http://docs.codehaus.org/display/JETTY/jetty.xml -->
9
+ <!-- -->
10
+ <!-- =============================================================== -->
11
+
12
+
13
+ <Configure id="Server" class="org.mortbay.jetty.Server">
14
+
15
+ <!-- Increase the maximum POST size to 1 MB to be able to handle large shard requests -->
16
+ <Call class="java.lang.System" name="setProperty">
17
+ <Arg>org.mortbay.jetty.Request.maxFormContentSize</Arg>
18
+ <Arg>1000000</Arg>
19
+ </Call>
20
+
21
+ <!-- =========================================================== -->
22
+ <!-- Server Thread Pool -->
23
+ <!-- =========================================================== -->
24
+ <Set name="ThreadPool">
25
+ <!-- Default bounded blocking threadpool
26
+ -->
27
+ <New class="org.mortbay.thread.BoundedThreadPool">
28
+ <Set name="minThreads">10</Set>
29
+ <Set name="lowThreads">50</Set>
30
+ <Set name="maxThreads">10000</Set>
31
+ </New>
32
+
33
+ <!-- Optional Java 5 bounded threadpool with job queue
34
+ <New class="org.mortbay.thread.concurrent.ThreadPool">
35
+ <Arg type="int">0</Arg>
36
+ <Set name="corePoolSize">10</Set>
37
+ <Set name="maximumPoolSize">250</Set>
38
+ </New>
39
+ -->
40
+ </Set>
41
+
42
+
43
+
44
+ <!-- =========================================================== -->
45
+ <!-- Set connectors -->
46
+ <!-- =========================================================== -->
47
+ <!-- One of each type! -->
48
+ <!-- =========================================================== -->
49
+
50
+ <!-- Use this connector for many frequently idle connections
51
+ and for threadless continuations.
52
+ <Call name="addConnector">
53
+ <Arg>
54
+ <New class="org.mortbay.jetty.nio.SelectChannelConnector">
55
+ <Set name="port"><SystemProperty name="jetty.port" default="8983"/></Set>
56
+ <Set name="maxIdleTime">30000</Set>
57
+ <Set name="Acceptors">2</Set>
58
+ <Set name="confidentialPort">8443</Set>
59
+ </New>
60
+ </Arg>
61
+ </Call>
62
+ -->
63
+
64
+ <!-- Use this connector if NIO is not available. -->
65
+ <!-- This connector is currently being used for Solr because the
66
+ nio.SelectChannelConnector showed poor performance under WindowsXP
67
+ from a single client with non-persistent connections (35s vs ~3min)
68
+ to complete 10,000 requests)
69
+ -->
70
+ <Call name="addConnector">
71
+ <Arg>
72
+ <New class="org.mortbay.jetty.bio.SocketConnector">
73
+ <Set name="port"><SystemProperty name="jetty.port" default="8983"/></Set>
74
+ <Set name="maxIdleTime">50000</Set>
75
+ <Set name="lowResourceMaxIdleTime">1500</Set>
76
+ </New>
77
+ </Arg>
78
+ </Call>
79
+
80
+ <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
81
+ <!-- To add a HTTPS SSL listener -->
82
+ <!-- see jetty-ssl.xml to add an ssl connector. use -->
83
+ <!-- java -jar start.jar etc/jetty.xml etc/jetty-ssl.xml -->
84
+ <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
85
+
86
+ <!-- =========================================================== -->
87
+ <!-- Set up global session ID manager -->
88
+ <!-- =========================================================== -->
89
+ <!--
90
+ <Set name="sessionIdManager">
91
+ <New class="org.mortbay.jetty.servlet.HashSessionIdManager">
92
+ <Set name="workerName">node1</Set>
93
+ </New>
94
+ </Set>
95
+ -->
96
+
97
+ <!-- =========================================================== -->
98
+ <!-- Set handler Collection Structure -->
99
+ <!-- =========================================================== -->
100
+ <Set name="handler">
101
+ <New id="Handlers" class="org.mortbay.jetty.handler.HandlerCollection">
102
+ <Set name="handlers">
103
+ <Array type="org.mortbay.jetty.Handler">
104
+ <Item>
105
+ <New id="Contexts" class="org.mortbay.jetty.handler.ContextHandlerCollection"/>
106
+ </Item>
107
+ <Item>
108
+ <New id="DefaultHandler" class="org.mortbay.jetty.handler.DefaultHandler"/>
109
+ </Item>
110
+ <Item>
111
+ <New id="RequestLog" class="org.mortbay.jetty.handler.RequestLogHandler"/>
112
+ </Item>
113
+ </Array>
114
+ </Set>
115
+ </New>
116
+ </Set>
117
+
118
+ <!-- =========================================================== -->
119
+ <!-- Configure the context deployer -->
120
+ <!-- A context deployer will deploy contexts described in -->
121
+ <!-- configuration files discovered in a directory. -->
122
+ <!-- The configuration directory can be scanned for hot -->
123
+ <!-- deployments at the configured scanInterval. -->
124
+ <!-- -->
125
+ <!-- This deployer is configured to deploy contexts configured -->
126
+ <!-- in the $JETTY_HOME/contexts directory -->
127
+ <!-- -->
128
+ <!-- =========================================================== -->
129
+ <Call name="addLifeCycle">
130
+ <Arg>
131
+ <New class="org.mortbay.jetty.deployer.ContextDeployer">
132
+ <Set name="contexts"><Ref id="Contexts"/></Set>
133
+ <Set name="configurationDir"><SystemProperty name="jetty.home" default="."/>/contexts</Set>
134
+ <Set name="scanInterval">1</Set>
135
+ </New>
136
+ </Arg>
137
+ </Call>
138
+
139
+ <!-- =========================================================== -->
140
+ <!-- Configure the webapp deployer. -->
141
+ <!-- A webapp deployer will deploy standard webapps discovered -->
142
+ <!-- in a directory at startup, without the need for additional -->
143
+ <!-- configuration files. It does not support hot deploy or -->
144
+ <!-- non standard contexts (see ContextDeployer above). -->
145
+ <!-- -->
146
+ <!-- This deployer is configured to deploy webapps from the -->
147
+ <!-- $JETTY_HOME/webapps directory -->
148
+ <!-- -->
149
+ <!-- Normally only one type of deployer need be used. -->
150
+ <!-- -->
151
+ <!-- =========================================================== -->
152
+ <Call name="addLifeCycle">
153
+ <Arg>
154
+ <New class="org.mortbay.jetty.deployer.WebAppDeployer">
155
+ <Set name="contexts"><Ref id="Contexts"/></Set>
156
+ <Set name="webAppDir"><SystemProperty name="jetty.home" default="."/>/webapps</Set>
157
+ <Set name="parentLoaderPriority">false</Set>
158
+ <Set name="extract">true</Set>
159
+ <Set name="allowDuplicates">false</Set>
160
+ <Set name="defaultsDescriptor"><SystemProperty name="jetty.home" default="."/>/etc/webdefault.xml</Set>
161
+ </New>
162
+ </Arg>
163
+ </Call>
164
+
165
+ <!-- =========================================================== -->
166
+ <!-- Configure Authentication Realms -->
167
+ <!-- Realms may be configured for the entire server here, or -->
168
+ <!-- they can be configured for a specific web app in a context -->
169
+ <!-- configuration (see $(jetty.home)/contexts/test.xml for an -->
170
+ <!-- example). -->
171
+ <!-- =========================================================== -->
172
+ <Set name="UserRealms">
173
+ <Array type="org.mortbay.jetty.security.UserRealm">
174
+ <!--
175
+ <Item>
176
+ <New class="org.mortbay.jetty.security.HashUserRealm">
177
+ <Set name="name">Test Realm</Set>
178
+ <Set name="config"><SystemProperty name="jetty.home" default="."/>/etc/realm.properties</Set>
179
+ </New>
180
+ </Item>
181
+ -->
182
+ </Array>
183
+ </Set>
184
+
185
+ <!-- =========================================================== -->
186
+ <!-- Configure Request Log -->
187
+ <!-- Request logs may be configured for the entire server here, -->
188
+ <!-- or they can be configured for a specific web app in a -->
189
+ <!-- contexts configuration (see $(jetty.home)/contexts/test.xml -->
190
+ <!-- for an example). -->
191
+ <!-- =========================================================== -->
192
+ <Ref id="RequestLog">
193
+ <Set name="requestLog">
194
+ <!-- New id="RequestLogImpl" class="org.mortbay.jetty.NCSARequestLog">
195
+ <Arg><SystemProperty name="jetty.logs" default="./logs"/>/yyyy_mm_dd.request.log</Arg>
196
+ <Set name="retainDays">90</Set>
197
+ <Set name="append">true</Set>
198
+ <Set name="extended">false</Set>
199
+ <Set name="LogTimeZone">GMT</Set>
200
+ </New -->
201
+ </Set>
202
+ </Ref>
203
+
204
+ <!-- =========================================================== -->
205
+ <!-- extra options -->
206
+ <!-- =========================================================== -->
207
+ <Set name="stopAtShutdown">true</Set>
208
+ <!-- ensure/prevent Server: header being sent to browsers -->
209
+ <Set name="sendServerVersion">true</Set>
210
+
211
+ </Configure>
212
+