rims 0.2.5 → 0.3.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.
@@ -118,6 +118,7 @@ module RIMS
118
118
  # daemon:
119
119
  # daemonize: true
120
120
  # debug: false
121
+ # umask: 0037
121
122
  # status_file: rims.pid
122
123
  # server_polling_interval_seconds: 3
123
124
  # server_privileged_user: nobody
@@ -157,10 +158,29 @@ module RIMS
157
158
  # send_buffer_limit_size: 16384
158
159
  # read_polling_interval_seconds: 1
159
160
  # command_wait_timeout_seconds: 1800
161
+ # protocol:
162
+ # line_length_limit: 8192
163
+ # literal_size_limit: 10485760
164
+ # command_size_limit: 10485760
165
+ # charset:
166
+ # use_default_aliases: true
167
+ # aliases:
168
+ # - name: euc-jp
169
+ # encoding: eucJP-ms
170
+ # - name: ios-2022-jp
171
+ # encoding: CP50221
172
+ # - name: Shift_JIS
173
+ # encoding: Windows-31J
174
+ # convert_options:
175
+ # replace_invalid_byte_sequence: false
176
+ # replace_undefined_character: true
177
+ # replaced_mark: "\uFFFD"
160
178
  # drb_services:
161
179
  # process_num: 4
180
+ # load_limit: 134217728
162
181
  # engine:
163
182
  # bulk_response_count: 100
183
+ # bulk_response_size: 33554432
164
184
  # read_lock_timeout_seconds: 30
165
185
  # write_lock_timeout_seconds: 30
166
186
  # cleanup_write_lock_timeout_seconds: 1
@@ -385,9 +405,8 @@ module RIMS
385
405
  end
386
406
 
387
407
  def daemonize?
388
- daemon_config = @config['daemon'] || {}
389
- if (daemon_config.key? 'daemonize') then
390
- daemon_config['daemonize']
408
+ if (@config.dig('daemon')&.key? 'daemonize') then
409
+ @config.dig('daemon', 'daemonize')
391
410
  else
392
411
  true
393
412
  end
@@ -398,14 +417,17 @@ module RIMS
398
417
  end
399
418
 
400
419
  def daemon_debug?
401
- daemon_config = @config['daemon'] || {}
402
- if (daemon_config.key? 'debug') then
403
- daemon_config['debug']
420
+ if (@config.dig('daemon')&.key? 'debug') then
421
+ @config.dig('daemon', 'debug')
404
422
  else
405
423
  false
406
424
  end
407
425
  end
408
426
 
427
+ def daemon_umask
428
+ @config.dig('daemon', 'umask') || 0037
429
+ end
430
+
409
431
  def status_file
410
432
  file_path = @config.dig('daemon', 'status_file') || 'rims.pid'
411
433
  file_path = Pathname(file_path)
@@ -521,22 +543,20 @@ module RIMS
521
543
  end
522
544
 
523
545
  def ssl_context
524
- if (openssl_config = @config['openssl']) then
525
- if (openssl_config.key? 'use_ssl') then
526
- use_ssl = openssl_config['use_ssl']
527
- else
528
- use_ssl = openssl_config.key? 'ssl_context'
529
- end
530
-
531
- if (use_ssl) then
532
- ssl_context = OpenSSL::SSL::SSLContext.new
533
- if (ssl_config_expr = openssl_config['ssl_context']) then
534
- anon_mod = SSLContextConfigAttribute.new_module(ssl_context, base_dir)
535
- SSLContextConfigAttribute.eval_config(anon_mod, ssl_config_expr, 'ssl_context')
536
- end
546
+ if (@config.dig('openssl')&.key? 'use_ssl') then
547
+ use_ssl = @config.dig('openssl', 'use_ssl')
548
+ else
549
+ use_ssl = (@config.dig('openssl')&.key? 'ssl_context') || false
550
+ end
537
551
 
538
- ssl_context
552
+ if (use_ssl) then
553
+ ssl_context = OpenSSL::SSL::SSLContext.new
554
+ if (ssl_config_expr = @config.dig('openssl', 'ssl_context')) then
555
+ anon_mod = SSLContextConfigAttribute.new_module(ssl_context, base_dir)
556
+ SSLContextConfigAttribute.eval_config(anon_mod, ssl_config_expr, 'ssl_context')
539
557
  end
558
+
559
+ ssl_context
540
560
  end
541
561
  end
542
562
 
@@ -551,14 +571,102 @@ module RIMS
551
571
  @config.dig('connection', 'command_wait_timeout_seconds') || 60 * 30)
552
572
  end
553
573
 
574
+ def protocol_line_length_limit
575
+ @config.dig('protocol', 'line_length_limit') || 1024 * 8
576
+ end
577
+
578
+ def protocol_literal_size_limit
579
+ @config.dig('protocol', 'literal_size_limit') || 1024**2 * 10
580
+ end
581
+
582
+ def protocol_command_size_limit
583
+ @config.dig('protocol', 'command_size_limit') || 1024**2 * 10
584
+ end
585
+
586
+ def charset_aliases
587
+ charset_aliases = RFC822::CharsetAliases.new
588
+
589
+ if (@config.dig('charset')&.key? 'use_default_aliases') then
590
+ use_default_aliases = @config.dig('charset', 'use_default_aliases')
591
+ else
592
+ use_default_aliases = true
593
+ end
594
+
595
+ if (use_default_aliases) then
596
+ for name, encoding in RFC822::DEFAULT_CHARSET_ALIASES
597
+ charset_aliases.add_alias(name, encoding)
598
+ end
599
+ end
600
+
601
+ if (alias_list = @config.dig('charset', 'aliases')) then
602
+ for an_alias in alias_list
603
+ charset_aliases.add_alias(an_alias['name'], Encoding.find(an_alias['encoding']))
604
+ end
605
+ end
606
+
607
+ charset_aliases
608
+ end
609
+
610
+ def charset_convert_options
611
+ options = {}
612
+
613
+ if (@config.dig('charset', 'convert_options')&.key? 'replace_invalid_byte_sequence') then
614
+ replace_invalid_byte_sequence = @config.dig('charset', 'convert_options', 'replace_invalid_byte_sequence')
615
+ else
616
+ replace_invalid_byte_sequence = false
617
+ end
618
+
619
+ if (replace_invalid_byte_sequence) then
620
+ options[:invalid] = :replace
621
+ end
622
+
623
+ if (@config.dig('charset', 'convert_options')&.key? 'replace_undefined_character') then
624
+ replace_undefined_character = @config.dig('charset', 'convert_options', 'replace_undefined_character')
625
+ else
626
+ replace_undefined_character = true
627
+ end
628
+
629
+ if (replace_undefined_character) then
630
+ options[:undef] = :replace
631
+ end
632
+
633
+ if (replaced_mark = @config.dig('charset', 'convert_options', 'replaced_mark')) then
634
+ options[:replace] = replaced_mark
635
+ end
636
+
637
+ options
638
+ end
639
+
554
640
  def drb_process_num
555
641
  @config.dig('drb_services', 'process_num') || 0
556
642
  end
557
643
 
644
+ def drb_server_config
645
+ config = {}
646
+ if (load_limit = @config.dig('drb_services', 'load_limit')) then
647
+ config[:load_limit] = load_limit
648
+ end
649
+
650
+ config
651
+ end
652
+
653
+ def drb_client_config
654
+ config = {}
655
+ if (load_limit = @config.dig('drb_services', 'load_limit')) then
656
+ config[:load_limit] = load_limit
657
+ end
658
+
659
+ config
660
+ end
661
+
558
662
  def bulk_response_count
559
663
  @config.dig('drb_services', 'engine', 'bulk_response_count') || 100
560
664
  end
561
665
 
666
+ def bulk_response_size
667
+ @config.dig('drb_services', 'engine', 'bulk_response_size') || 1024**2 * 10
668
+ end
669
+
562
670
  def read_lock_timeout_seconds
563
671
  @config.dig('drb_services', 'engine', 'read_lock_timeout_seconds') ||
564
672
  @config.dig('read_lock_timeout_seconds') || # for backward compatibility
@@ -639,8 +747,8 @@ module RIMS
639
747
  end
640
748
 
641
749
  def make_authentication
642
- if ((@config.key? 'authentication') && (@config['authentication'].is_a? Hash)) then
643
- auth_conf = @config['authentication']
750
+ if (@config.dig('authentication')&.is_a? Hash) then
751
+ auth_conf = @config.dig('authentication')
644
752
  else
645
753
  auth_conf = {}
646
754
  end
@@ -679,8 +787,8 @@ module RIMS
679
787
  end
680
788
 
681
789
  # for backward compatibility
682
- if ((@config.key? 'authentication') && (@config['authentication'].is_a? Array)) then
683
- plug_in_list = @config['authentication']
790
+ if (@config.dig('authentication')&.is_a? Array) then
791
+ plug_in_list = @config.dig('authentication')
684
792
  for plug_in_conf in plug_in_list
685
793
  plug_in_name = plug_in_conf['plug_in'] or raise KeyError, 'not found an authentication plug_in.'
686
794
  plug_in_config = get_configuration(plug_in_conf)
@@ -717,16 +825,16 @@ module RIMS
717
825
  using Logger::JointPlus
718
826
 
719
827
  def setup(server, daemon: false)
720
- file_logger_params = @config.make_file_logger_params
721
- logger = Logger.new(*file_logger_params)
828
+ *file_logger_params, file_logger_opts = @config.make_file_logger_params
829
+ logger = Logger.new(*file_logger_params, **file_logger_opts)
722
830
 
723
- stdout_logger_params = @config.make_stdout_logger_params
831
+ *stdout_logger_params, stdout_logger_opts = @config.make_stdout_logger_params
724
832
  unless (daemon && @config.daemonize?) then
725
- logger += Logger.new(*stdout_logger_params)
833
+ logger += Logger.new(*stdout_logger_params, **stdout_logger_opts)
726
834
  end
727
835
 
728
- protocol_logger_params = @config.make_protocol_logger_params
729
- protocol_logger = Logger.new(*protocol_logger_params)
836
+ *protocol_logger_params, protocol_logger_opts = @config.make_protocol_logger_params
837
+ protocol_logger = Logger.new(*protocol_logger_params, **protocol_logger_opts)
730
838
 
731
839
  logger.info('preload libraries.')
732
840
  Riser.preload
@@ -780,22 +888,27 @@ module RIMS
780
888
  end
781
889
  end
782
890
 
783
- services = Riser::DRbServices.new(drb_process_num)
784
- services.add_sticky_process_service(:engine,
785
- Riser::ResourceSet.build{|builder|
786
- builder.at_create{|unique_user_id|
787
- mail_store = MailStore.build(unique_user_id, kvs_meta_open, kvs_text_open)
788
- Protocol::Decoder::Engine.new(unique_user_id, mail_store, logger,
789
- bulk_response_count: @config.bulk_response_count,
790
- read_lock_timeout_seconds: @config.read_lock_timeout_seconds,
791
- write_lock_timeout_seconds: @config.write_lock_timeout_seconds,
792
- cleanup_write_lock_timeout_seconds: @config.cleanup_write_lock_timeout_seconds)
793
- }
794
- builder.at_destroy{|engine|
795
- engine.destroy
796
- }
797
- builder.alias_unref(:destroy)
798
- })
891
+ drb_services = Riser::DRbServices.new(drb_process_num,
892
+ server_config: @config.drb_server_config,
893
+ client_config: @config.drb_client_config)
894
+ drb_services.add_sticky_process_service(:engine,
895
+ Riser::ResourceSet.build{|builder|
896
+ builder.at_create{|unique_user_id|
897
+ mail_store = MailStore.build(unique_user_id, kvs_meta_open, kvs_text_open)
898
+ Protocol::Decoder::Engine.new(unique_user_id, mail_store, logger,
899
+ bulk_response_count: @config.bulk_response_count,
900
+ bulk_response_size: @config.bulk_response_size,
901
+ read_lock_timeout_seconds: @config.read_lock_timeout_seconds,
902
+ write_lock_timeout_seconds: @config.write_lock_timeout_seconds,
903
+ cleanup_write_lock_timeout_seconds: @config.cleanup_write_lock_timeout_seconds,
904
+ charset_aliases: @config.charset_aliases,
905
+ charset_convert_options: @config.charset_convert_options)
906
+ }
907
+ builder.at_destroy{|engine|
908
+ engine.destroy
909
+ }
910
+ builder.alias_unref(:destroy)
911
+ })
799
912
 
800
913
  server.before_start{|server_socket|
801
914
  logger.info('start server.')
@@ -806,17 +919,17 @@ module RIMS
806
919
  file_logger_params[1..-2].each_with_index do |value, i|
807
920
  logger.info("file logging parameter: shift_args[#{i}]=#{value}")
808
921
  end
809
- for name, value in file_logger_params[-1]
922
+ for name, value in file_logger_opts
810
923
  logger.info("file logging parameter: #{name}=#{value}")
811
924
  end
812
- for name, value in stdout_logger_params[-1]
925
+ for name, value in stdout_logger_opts
813
926
  logger.info("stdout logging parameter: #{name}=#{value}")
814
927
  end
815
928
  logger.info("protocol logging parameter: path=#{protocol_logger_params[0]}")
816
929
  protocol_logger_params[1..-2].each_with_index do |value, i|
817
930
  logger.info("protocol logging parameter: shift_args[#{i}]=#{value}")
818
931
  end
819
- for name, value in protocol_logger_params[-1]
932
+ for name, value in protocol_logger_opts
820
933
  logger.info("protocol logging parameter: #{name}=#{value}")
821
934
  end
822
935
  logger.info("listen address: #{server_socket.local_address.inspect_sockaddr}")
@@ -895,22 +1008,38 @@ module RIMS
895
1008
  logger.info("connection parameter: send_buffer_limit_size=#{@config.send_buffer_limit_size}")
896
1009
  logger.info("connection parameter: read_polling_interval_seconds=#{conn_limits.read_polling_interval_seconds}")
897
1010
  logger.info("connection parameter: command_wait_timeout_seconds=#{conn_limits.command_wait_timeout_seconds}")
1011
+ logger.info("protocol parameter: line_length_limit=#{@config.protocol_line_length_limit}")
1012
+ logger.info("protocol parameter: literal_size_limit=#{@config.protocol_literal_size_limit}")
1013
+ logger.info("protocol parameter: command_size_limit=#{@config.protocol_command_size_limit}")
1014
+ @config.charset_aliases.each_with_index do |(name, enc), i|
1015
+ logger.info("charset aliases parameter: alias[#{i}]: #{name} -> #{enc.name}")
1016
+ end
1017
+ for name, value in @config.charset_convert_options
1018
+ logger.info("charset convert_options parameter: #{name}=#{value}")
1019
+ end
898
1020
  logger.info("drb_services parameter: process_num=#{drb_process_num}")
1021
+ for name, value in @config.drb_server_config
1022
+ logger.info("drb_services server config parameter: #{name}=#{value}")
1023
+ end
1024
+ for name, value in @config.drb_client_config
1025
+ logger.info("drb_services client config parameter: #{name}=#{value}")
1026
+ end
899
1027
  logger.info("drb_services engine parameter: bulk_response_count=#{@config.bulk_response_count}")
900
- logger.info("lock parameter: read_lock_timeout_seconds=#{@config.read_lock_timeout_seconds}")
901
- logger.info("lock parameter: write_lock_timeout_seconds=#{@config.write_lock_timeout_seconds}")
902
- logger.info("lock parameter: cleanup_write_lock_timeout_seconds=#{@config.cleanup_write_lock_timeout_seconds}")
1028
+ logger.info("drb_services engine parameter: bulk_response_size=#{@config.bulk_response_size}")
1029
+ logger.info("drb_services engine parameter: read_lock_timeout_seconds=#{@config.read_lock_timeout_seconds}")
1030
+ logger.info("drb_services engine parameter: write_lock_timeout_seconds=#{@config.write_lock_timeout_seconds}")
1031
+ logger.info("drb_services engine parameter: cleanup_write_lock_timeout_seconds=#{@config.cleanup_write_lock_timeout_seconds}")
903
1032
  kvs_meta_log.call
904
1033
  kvs_text_log.call
905
1034
  logger.info("authentication parameter: hostname=#{auth.hostname}")
906
1035
  logger.info("authorization parameter: mail_delivery_user=#{@config.mail_delivery_user}")
907
1036
 
908
1037
  logger.info('dRuby services: start server.')
909
- services.start_server
1038
+ drb_services.start_server
910
1039
  }
911
1040
  server.at_fork{
912
1041
  logger.info('dRuby services: detach server.')
913
- services.detach_server
1042
+ drb_services.detach_server
914
1043
  }
915
1044
  server.at_stop{|stop_state|
916
1045
  case (stop_state)
@@ -926,7 +1055,7 @@ module RIMS
926
1055
  }
927
1056
  server.preprocess{
928
1057
  logger.info('dRuby services: start client.')
929
- services.start_client
1058
+ drb_services.start_client
930
1059
  auth.start_plug_in(logger)
931
1060
  }
932
1061
  server.dispatch{|socket|
@@ -947,7 +1076,11 @@ module RIMS
947
1076
  stream = Riser::WriteBufferStream.new(socket, @config.send_buffer_limit_size)
948
1077
  end
949
1078
  stream = Riser::LoggingStream.new(stream, protocol_logger)
950
- decoder = Protocol::Decoder.new_decoder(services, auth, logger, mail_delivery_user: @config.mail_delivery_user)
1079
+ decoder = Protocol::Decoder.new_decoder(drb_services, auth, logger,
1080
+ mail_delivery_user: @config.mail_delivery_user,
1081
+ line_length_limit: @config.protocol_line_length_limit,
1082
+ literal_size_limit: @config.protocol_literal_size_limit,
1083
+ command_size_limit: @config.protocol_command_size_limit)
951
1084
  Protocol::Decoder.repl(decoder, conn_limits, stream, stream, logger)
952
1085
  ensure
953
1086
  if (stream) then
@@ -980,7 +1113,7 @@ module RIMS
980
1113
  }
981
1114
  server.after_stop{
982
1115
  logger.info('dRuby services: stop server.')
983
- services.stop_server
1116
+ drb_services.stop_server
984
1117
  logger.info('stop server.')
985
1118
  }
986
1119
 
@@ -1,5 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
+ require 'digest'
3
4
  require 'fileutils'
4
5
  require 'set'
5
6
 
@@ -37,8 +38,7 @@ module RIMS
37
38
  module_function :message_data_list
38
39
 
39
40
  def make_body(description)
40
- reader = RIMS::Protocol::RequestReader.new(StringIO.new('', 'r'), StringIO.new('', 'w'), Logger.new(STDOUT))
41
- reader.parse(reader.scan_line(description))[0]
41
+ RIMS::Protocol::RequestReader.parse(RIMS::Protocol::RequestReader.scan(description))[0]
42
42
  end
43
43
  private :make_body
44
44
 
@@ -67,23 +67,30 @@ module RIMS
67
67
  end
68
68
 
69
69
  module ProtocolFetchMailSample
70
- def make_mail_simple
71
- @simple_mail = RIMS::RFC822::Message.new(<<-'EOF')
70
+ simple_mail_body = <<-'EOF'.freeze
71
+ Hello world.
72
+ EOF
73
+
74
+ MAIL_SIMPLE_TEXT = (<<-"EOF" + simple_mail_body).freeze
72
75
  To: foo@nonet.org
73
76
  From: bar@nonet.org
74
77
  Subject: test
75
78
  MIME-Version: 1.0
76
79
  Content-Type: text/plain; charset=us-ascii
77
80
  Content-Transfer-Encoding: 7bit
81
+ Content-MD5: #{[ Digest::MD5.digest(simple_mail_body) ].pack('m').strip}
82
+ Content-Language: en-US, en
78
83
  Date: Fri, 8 Nov 2013 06:47:50 +0900 (JST)
79
84
 
80
- Hello world.
81
- EOF
85
+ EOF
86
+
87
+ def make_mail_simple
88
+ @simple_mail = RIMS::RFC822::Message.new(MAIL_SIMPLE_TEXT)
89
+ @simple_mail_body = @simple_mail.body.raw_source
82
90
  end
83
91
  private :make_mail_simple
84
92
 
85
- def make_mail_multipart
86
- @mpart_mail = RIMS::RFC822::Message.new(<<-'EOF')
93
+ MPART_MAIL_TEXT = <<-'EOF'.freeze
87
94
  To: bar@nonet.com
88
95
  From: foo@nonet.com
89
96
  Subject: multipart test
@@ -97,6 +104,9 @@ Content-Type: text/plain; charset=us-ascii
97
104
  Multipart test.
98
105
  --1383.905529.351297
99
106
  Content-Type: application/octet-stream
107
+ Content-Disposition: attachment
108
+ ; filename=test.dat
109
+ ; modification-date="Wed, 12 Feb 1997 16:29:51 -0500"
100
110
 
101
111
  0123456789
102
112
  --1383.905529.351297
@@ -108,6 +118,9 @@ Subject: inner multipart
108
118
  MIME-Version: 1.0
109
119
  Date: Fri, 8 Nov 2013 19:31:03 +0900
110
120
  Content-Type: multipart/mixed; boundary="1383.905529.351298"
121
+ Content-Disposition: attachment; filename=hello.txt
122
+ Content-Language: en
123
+ Content-Location: test
111
124
 
112
125
  --1383.905529.351298
113
126
  Content-Type: text/plain; charset=us-ascii
@@ -123,7 +136,9 @@ Content-Type: multipart/mixed; boundary="1383.905529.351299"
123
136
 
124
137
  --1383.905529.351299
125
138
  Content-Type: image/gif
139
+ Content-Disposition: inline
126
140
 
141
+ GIF image...
127
142
  --1383.905529.351299
128
143
  Content-Type: message/rfc822
129
144
 
@@ -136,6 +151,7 @@ Content-Type: multipart/mixed; boundary="1383.905529.351300"
136
151
 
137
152
  --1383.905529.351300
138
153
  Content-Type: text/plain; charset=us-ascii
154
+ Content-Location: foo
139
155
 
140
156
  HALO
141
157
  --1383.905529.351300
@@ -143,10 +159,12 @@ Content-Type: multipart/alternative; boundary="1383.905529.351301"
143
159
 
144
160
  --1383.905529.351301
145
161
  Content-Type: text/plain; charset=us-ascii
162
+ Content-Location: bar
146
163
 
147
164
  alternative message.
148
165
  --1383.905529.351301
149
166
  Content-Type: text/html; charset=us-ascii
167
+ Content-Location: baz
150
168
 
151
169
  <html>
152
170
  <body><p>HTML message</p></body>
@@ -155,12 +173,14 @@ Content-Type: text/html; charset=us-ascii
155
173
  --1383.905529.351300--
156
174
  --1383.905529.351299--
157
175
  --1383.905529.351297--
158
- EOF
176
+ EOF
177
+
178
+ def make_mail_multipart
179
+ @mpart_mail = RIMS::RFC822::Message.new(MPART_MAIL_TEXT)
159
180
  end
160
181
  private :make_mail_multipart
161
182
 
162
- def make_mail_mime_subject
163
- @mime_subject_mail = RIMS::RFC822::Message.new(<<-'EOF')
183
+ MAIL_MIME_SUBJECT_TEXT = <<-'EOF'.freeze
164
184
  Date: Fri, 8 Nov 2013 19:31:03 +0900
165
185
  Subject: =?ISO-2022-JP?B?GyRCJEYkOSRIGyhC?=
166
186
  From: foo@nonet.com, bar <bar@nonet.com>
@@ -176,22 +196,28 @@ In-Reply-To: <20131106081723.5KJU1774292@smtp.test.com>
176
196
  Message-Id: <20131107214750.445A1255B9F@smtp.nonet.com>
177
197
 
178
198
  Hello world.
179
- EOF
199
+ EOF
200
+
201
+ def make_mail_mime_subject
202
+ @mime_subject_mail = RIMS::RFC822::Message.new(MAIL_MIME_SUBJECT_TEXT)
180
203
  end
181
204
  private :make_mail_mime_subject
182
205
 
206
+ MAIL_EMPTY_TEXT = ''.freeze
207
+
183
208
  def make_mail_empty
184
- @empty_mail = RIMS::RFC822::Message.new('')
209
+ @empty_mail = RIMS::RFC822::Message.new(MAIL_EMPTY_TEXT)
185
210
  end
186
211
  private :make_mail_empty
187
212
 
213
+ MAIL_NO_BODY_TEXT = "Subject: foo\r\n\r\n".freeze
214
+
188
215
  def make_mail_no_body
189
- @no_body_mail = RIMS::RFC822::Message.new('foo')
216
+ @no_body_mail = RIMS::RFC822::Message.new(MAIL_NO_BODY_TEXT)
190
217
  end
191
218
  private :make_mail_no_body
192
219
 
193
- def make_mail_address_header_pattern
194
- @address_header_pattern_mail = RIMS::RFC822::Message.new(<<-'EOF')
220
+ MAIL_ADDRESS_HEADER_PATTERN_TEXT = <<-'EOF'.freeze
195
221
  To: "foo@nonet.org" <foo@nonet.org>
196
222
  From: bar@nonet.org
197
223
  Subject: test
@@ -201,7 +227,10 @@ Content-Transfer-Encoding: 7bit
201
227
  Date: Fri, 8 Nov 2013 06:47:50 +0900 (JST)
202
228
 
203
229
  Hello world.
204
- EOF
230
+ EOF
231
+
232
+ def make_mail_address_header_pattern
233
+ @address_header_pattern_mail = RIMS::RFC822::Message.new(MAIL_ADDRESS_HEADER_PATTERN_TEXT)
205
234
  end
206
235
  private :make_mail_address_header_pattern
207
236
  end