/[pupa]/bugcomm/server/bts/session.rb
ViewVC logotype

Diff of /bugcomm/server/bts/session.rb

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1 by okuji, Sat Aug 10 12:02:16 2002 UTC revision 1.2 by okuji, Sun Aug 11 16:47:21 2002 UTC
# Line 30  module BTS Line 30  module BTS
30    
31      PROTOCOL_VERSION = '1.0'      PROTOCOL_VERSION = '1.0'
32            
33        CANONICAL_METAVARIABLES = [
34          "AUTH_TYPE",
35          "CONTENT_LENGTH",
36          "CONTENT_TYPE",
37          "GATEWAY_INTERFACE",
38          "PATH_INFO",
39          "PATH_TRANSLATED",
40          "QUERY_STRING",
41          "REMOTE_ADDR",
42          "REMOTE_HOST",
43          "REMOTE_IDENT",
44          "REMOTE_USER",
45          "REQUEST_METHOD",
46          "SCRIPT_NAME",
47          "SERVER_NAME",
48          "SERVER_PORT",
49          "SERVER_PROTOCOL",
50          "SERVER_SOFTWARE"
51        ]
52        
53      def initialize(socket, config)      def initialize(socket, config)
54        @socket = socket        @socket = socket
55        @config = config        @config = config
56          @buffer = ''
57    
58        System.debug('from %s: connected', @socket.peeraddr[2])        System.debug('from %s: connected', @socket.peeraddr[2])
59      end      end
# Line 58  module BTS Line 79  module BTS
79      private :error      private :error
80    
81      def gets      def gets
82        begin        while true
83          timeout(30) do          if /\A(.*\n)([.\n]*)/ =~ @buffer
84            return @socket.gets            @buffer = $2
85              return $1
86            end
87            
88            if @buffer.size > @config.session_max_size
89              error 'too long line'
90              return nil
91            end
92            
93            begin
94              @buffer << @socket.sysread(@config.session_max_size)
95            rescue EOFError
96              error 'unexpected EOF'
97              return nil
98          end          end
       rescue TimeoutError  
         error 'terminated due to a time out'  
         return nil  
99        end        end
100      end      end
101      private :gets      private :gets
# Line 74  module BTS Line 105  module BTS
105        # strings for security?        # strings for security?
106        str = ''        str = ''
107        while true        while true
         if @socket.eof?  
           error 'unexpected EOF'  
           return  
         end  
   
108          line = gets          line = gets
109          return if line.nil?          return false if line.nil?
110                    
         if /\r?\n/ !~ line  
           error "no trailing CRLF found in `#{line}'"  
           return  
         end  
   
111          break if /^\.\r?\n/ =~ line          break if /^\.\r?\n/ =~ line
112    
113          line.sub!(/^\./, '')          line.sub!(/^\./, '')
114          line.chop!          line.chop!
115          str << line + "\r\n"          str << line + "\r\n"
116            
117            if str.size > @config.session_max_size
118              error 'too long mail'
119              return false
120            end
121        end        end
122    
123        System.debug('from %s: %s', @socket.peeraddr[2], str)        System.debug('from %s: %s', @socket.peeraddr[2], str)
# Line 99  module BTS Line 125  module BTS
125        # FIXME: do something useful here...        # FIXME: do something useful here...
126    
127        ok "dummy"        ok "dummy"
128          true
129      end      end
130      private :handle_mail      private :handle_mail
131    
# Line 108  module BTS Line 135  module BTS
135        value = nil        value = nil
136        metavars = {}        metavars = {}
137        while true        while true
         if @socket.eof?  
           error 'unexpected EOF'  
           return  
         end  
   
138          line = gets          line = gets
139          return if line.nil?          return false if line.nil?
140                    
         if /\r?\n/ !~ line  
           error "no trailing CRLF found in `#{line}'"  
         end  
   
141          break if /^\.\r?\n/ =~ line          break if /^\.\r?\n/ =~ line
142    
143          line.chop!          line.chop!
# Line 130  module BTS Line 148  module BTS
148          else          else
149            if name.nil? or value.nil?            if name.nil? or value.nil?
150              error "malformed input line `#{line}'"              error "malformed input line `#{line}'"
151              return              return false
152            end            end
153    
154            value << "\r\n" + line            value << "\r\n" + line
155              
156              if value.size > @config.session_max_size
157                error "too big value for `#{name}'"
158                return false
159              end
160          end          end
161    
162          metavars[name] = value          if CANONICAL_METAVARIABLES.include?(name) or /^HTTP_/ =~ name
163              metavars[name] = value
164            end
165        end        end
166                
167        System.debug('from %s: %s',        System.debug('from %s: %s',
# Line 147  module BTS Line 172  module BTS
172    
173        body = ''        body = ''
174        while true        while true
         if @socket.eof?  
           error 'unexpected EOF'  
           return  
         end  
   
175          line = gets          line = gets
176          return if line.nil?          return false if line.nil?
           
         if /\r?\n/ !~ line  
           error "no trailing CRLF found in `#{line}'"  
         end  
177                    
178          break if /^\.\r?\n/ =~ line          break if /^\.\r?\n/ =~ line
179    
180          line.sub!(/^\./, '')          line.sub!(/^\./, '')
181          line.chop!          line.chop!
182          body << line + "\r\n"          body << line + "\r\n"
183    
184            if body.size > @config.session_max_size
185              error 'too big HTTP request'
186              return false
187            end
188        end        end
189    
190        System.debug('from %s: %s', @socket.peeraddr[2], body)        System.debug('from %s: %s', @socket.peeraddr[2], body)
# Line 174  module BTS Line 195  module BTS
195        tmp = body.gsub(/^\./, '..')        tmp = body.gsub(/^\./, '..')
196        @socket << "Content-Type: text/plain\r\n\r\n#{tmp}"        @socket << "Content-Type: text/plain\r\n\r\n#{tmp}"
197        @socket << ".\r\n"        @socket << ".\r\n"
198          true
199      end      end
200      private :handle_cgi      private :handle_cgi
201        
202      def run      def handle_command(cmd, *args)
203        until @socket.eof?        case cmd
204          line = gets        when 'VERSION'
205          return if line.nil?          if args.size != 1
206              error 'one argument is required for VERSION'
207              return false
208            end
209                    
210          if /\r?\n/ !~ line          if args[0] != PROTOCOL_VERSION
211            error "no trailing CRLF found in `#{line}'"            error "unsupported protocol version `#{args[0]}'"
212            return            return false
213          end          end
   
         System.info('from %s: %s', @socket.peeraddr[2], line.chop)  
214                    
215          cmd, *args = line.chop.split(/\s+/)          ok "use the protocol version #{PROTOCOL_VERSION}"
216                    
217          case cmd        when 'EXPIRE'
218          when 'VERSION'          if args.size != 0
219            if args.size != 1            error 'no argument is required for EXPIRE'
220              error 'one argument is required for VERSION'            return false
221              return          end
222            end          
223                      # FIXME: do something useful here...
224            if args[0] != PROTOCOL_VERSION          
225              error "unsupported protocol version `#{args[0]}'"          ok "dummy"
226              return          
227            end        when 'OPTIMIZE'
228            if args.size != 0
229            ok "use the protocol version #{PROTOCOL_VERSION}"            error 'no argument is required for OPTIMIZE'
230                        return false
231          when 'EXPIRE'          end
232            if args.size != 0          
233              error 'no argument is required for EXPIRE'          # FIXME: do something useful here...
234              return          
235            end          ok "dummy"
236            
237            # FIXME: do something useful here...        when 'MAIL'
238            if args.size != 0
239            ok "dummy"            error 'no argument is required for MAIL'
240                        return false
241          when 'OPTIMIZE'          end
242            if args.size != 0          
243              error 'no argument is required for OPTIMIZE'          return handle_mail()
244              return          
245            end        when 'CGI'
246            if args.size != 0
247            # FIXME: do something useful here...            error 'no argument is required for CGI'
248              return false
249            ok "dummy"          end
250                      
251          when 'MAIL'          return handle_cgi()
252            if args.size != 0          
253              error 'no argument is required for MAIL'        when 'BYE'
254              return          if args.size != 0
255            end            error 'no argument is required for BYE'
256              return false
257            handle_mail          end
258                      
259          when 'CGI'          ok "good-bye!"
260            if args.size != 0          return false
261              error 'no argument is required for CGI'          
262              return        else
263            end          error "unknown command `#{cmd}'"
264            return false
265            handle_cgi        end
266    
267          when 'BYE'        true
268            if args.size != 0      end
269              error 'no argument is required for BYE'        
270              return      def run
271          begin
272            timeout(@config.session_max_time) do
273              count = 0
274              while count <= @config.session_max_commands
275                line = gets
276                return if line.nil?
277                
278                System.info('from %s: %s', @socket.peeraddr[2], line.chop)
279                
280                cmd, *args = line.chop.split(/\s+/)
281                break unless handle_command(cmd, *args)
282                count += 1
283            end            end
   
           ok "good-bye!"  
           return  
             
         else  
           error "unknown command `#{cmd}'"  
           return  
284          end          end
285          rescue TimeoutError
286            error 'too long session time'
287        end        end
288      end      end
289    
290      def close      def close
291          System.debug('%s: closed', @socket.peeraddr[2])
292          
293        @socket.close        @socket.close
294      end      end
295            

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.2

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26