Class: Net::AJP13::Server

Inherits:
Object
  • Object
show all
Includes:
Mutex_m, Constants
Defined in:
lib/net/ajp13server.rb

Overview

Provides a skeleton to implement an AJP 1.3 server.

Defined Under Namespace

Classes: BodyInput, ProcessRequestNotImplementedError

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ Server

host

Host to bind. If ommited or nil, the server will accept requests from any hosts.

serivce

Port number to bind. It can be a service name registered in /etc/services (or NIS).



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/net/ajp13server.rb', line 48

def initialize(*args) #:args: [host,] service = DEFAULT_PORT
  @host = nil
  @service = DEFAULT_PORT

  case args.length
  when 2
    @host = args[0] if args[0]
    @service = args[1] if args[1]
    @open_socket = lambda{ TCPServer.new(@host, @service) }
  when 1
    @service = args[0] if args[0]
    @open_socket = lambda{ TCPServer.new(@service) }
  when 0
    @open_socket = lambda{ TCPServer.new(@service) }
  else
    raise ArgumentError, "wrong number of arguments (#{args.length} for 0..2)"
  end
end

Instance Attribute Details

#hostObject (readonly)

The instance accepts only requests from #host. If host is nil, it accepts requests from any hosts.

See Also

TCPServer.new, bind(2)



70
71
72
# File 'lib/net/ajp13server.rb', line 70

def host
  @host
end

#loggerObject

logger



76
77
78
# File 'lib/net/ajp13server.rb', line 76

def logger
  @logger
end

#serviceObject (readonly)

The port number to bind.



73
74
75
# File 'lib/net/ajp13server.rb', line 73

def service
  @service
end

Instance Method Details

#process_request(request) ⇒ Object

You must override this method. The default implementation simply raises a ProcessRequestNotImplementedError.

request

The Net::AJP13::Request object that represents an accepted AJP request.

The return value must be a Net::AJP13::Response object.



128
129
130
# File 'lib/net/ajp13server.rb', line 128

def process_request(request)
  raise ProcessRequestNotImplementedError, "Must be overridden."
end

#start(sock = nil) ⇒ Object



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/net/ajp13server.rb', line 85

def start(sock = nil)
  logger.info("Starting #{self.class}")
  if sock
    @sock = sock
  else
    @sock = @open_socket.call
  end

  @sock.listen(5)
  begin
    until @shutdown
      accepted = @sock.accept
	Thread.new {
 begin
   until accepted.closed?
            process(accepted)
   end
 rescue StandardError => err
   logger.error("#{err.message} from #{err.backtrace("\n")}")
 rescue Object => err
   logger.fatal("#{err.message} from #{err.backtrace("\n")}")
 else
   logger.debug("closed")
 ensure
   accepted.close unless accepted.closed?
 end
	}
    end
  end

  logger.info("Exited normally.")
rescue Interrupt
  logger.info("Exited by Interrupt.")
ensure
  @sock.close if @sock and !@sock.closed?
end