1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
17
  
18
  
19
  
20
  
21
  
22
  
23
  
24
  
25
  
26
  
27
  
28
  
29
  
30
  
31
  
32
  
33
  
34
  
35
  
36
  
37
  
38
  
39
  
40
  
41
  
42
  
43
  
44
  
45
  
46
  
47
  
48
  
#pike __REAL_VERSION__ 
 
Stdio.Port port; 
int portno; 
string|int(0..0) interface; 
function(.Request:void) callback; 
 
//! 
object|function|program request_program=.Request; 
 
//! The simplest server possible. Binds a port and calls 
//! a callback with @[request_program] objects. 
 
//! 
void create(function(.Request:void) callback, 
            void|int portno, 
            void|string interface, 
            void|int reuse_port) 
{ 
  this::portno=portno || 80; 
 
  this::callback=callback; 
  this::interface=interface; 
  port=Stdio.Port(); 
  if (!port->bind(portno,new_connection,interface,reuse_port)) 
    error("HTTP.Server.Port: failed to bind port %s%d: %s.\n", 
          interface?interface+":":"", 
          portno,strerror(port->errno())); 
} 
 
//! Closes the HTTP port. 
void close() 
{ 
   destruct(port); 
   port=0; 
} 
 
protected void _destruct() { close(); } 
 
// the port accept callback 
 
protected void new_connection() 
{ 
    while( Stdio.File fd=port->accept() ) 
      request_program()->attach_fd(fd,this,callback); 
}