In Files

Parent

FCGI::Server

Constants

DATA_UNIT

Public Class Methods

new(server) click to toggle source
    # File lib/fcgi.rb, line 89
89:       def initialize(server)
90:         @server = server
91:         @buffers = {}
92:         @default_parameters = {
93:           "FCGI_MAX_CONNS" => 1,
94:           "FCGI_MAX_REQS"  => 1,
95:           "FCGI_MPX_CONNS" => true
96:         }
97:       end

Public Instance Methods

each_request(&block) click to toggle source
     # File lib/fcgi.rb, line 99
 99:       def each_request(&block)
100:         graceful = false
101:         trap("SIGUSR1") { graceful = true }
102:         while true
103:           begin
104:             session(&block)
105:           rescue Errno::EPIPE, EOFError
106:             # HTTP request is canceled by the remote user
107:           end
108:           exit 0 if graceful
109:         end
110:       end
session() click to toggle source
     # File lib/fcgi.rb, line 112
112:       def session
113:         sock, addr = *@server.accept
114:         return unless sock
115:         fsock = FastCGISocket.new(sock)
116:         req = next_request(fsock)
117:         yield req
118:         respond_to req, fsock, FCGI_REQUEST_COMPLETE
119:       ensure
120:         sock.close if sock and not sock.closed?
121:       end

Private Instance Methods

handle_GET_VALUES(rec) click to toggle source
     # File lib/fcgi.rb, line 153
153:       def handle_GET_VALUES(rec)
154:         h = {}
155:         rec.values.each_key do |name|
156:           h[name] = @default_parameters[name]
157:         end
158:         ValuesRecord.new(FCGI_GET_VALUES_RESULT, rec.request_id, h)
159:       end
next_request(sock) click to toggle source
     # File lib/fcgi.rb, line 125
125:       def next_request(sock)
126:         while rec = sock.read_record
127:           if rec.management_record?
128:             case rec.type
129:             when FCGI_GET_VALUES
130:               sock.send_record handle_GET_VALUES(rec)
131:             else
132:               sock.send_record UnknownTypeRecord.new(rec.request_id, rec.type)
133:             end
134:           else
135:             case rec.type
136:             when FCGI_BEGIN_REQUEST
137:               @buffers[rec.request_id] = RecordBuffer.new(rec)
138:             when FCGI_ABORT_REQUEST
139:               raise "got ABORT_REQUEST"   # FIXME
140:             else
141:               buf = @buffers[rec.request_id]   or next # inactive request
142:               buf.push rec
143:               if buf.ready?
144:                 @buffers.delete rec.request_id
145:                 return buf.new_request
146:               end
147:             end
148:           end
149:         end
150:         raise "must not happen: FCGI socket unexpected EOF"
151:       end
respond_to(req, sock, status) click to toggle source
     # File lib/fcgi.rb, line 161
161:       def respond_to(req, sock, status)
162:         split_data(FCGI_STDOUT, req.id, req.out) do |rec|
163:           sock.send_record rec
164:         end
165:         split_data(FCGI_STDERR, req.id, req.err) do |rec|
166:           sock.send_record rec
167:         end if req.err.length > 0
168:         sock.send_record EndRequestRecord.new(req.id, 0, status)
169:       end
split_data(type, id, f) click to toggle source
     # File lib/fcgi.rb, line 173
173:       def split_data(type, id, f)
174:         unless f.length == 0
175:           f.rewind
176:           while s = f.read(DATA_UNIT)
177:             yield GenericDataRecord.new(type, id, s)
178:           end
179:         end
180:         yield GenericDataRecord.new(type, id, '')
181:       end

Disabled; run with --debug to generate this.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.