diff --git a/lib/modules/Protocols.pmod/HTTP.pmod/Server.pmod/Request.pike b/lib/modules/Protocols.pmod/HTTP.pmod/Server.pmod/Request.pike
index 32800ee72b9a55bd1b492c2bd8737aaf2fe5a2fa..941af39620dc7663f69b65b51e225879ee1edfd7 100644
--- a/lib/modules/Protocols.pmod/HTTP.pmod/Server.pmod/Request.pike
+++ b/lib/modules/Protocols.pmod/HTTP.pmod/Server.pmod/Request.pike
@@ -104,15 +104,18 @@ int send_timeout_delay=180;
 int connection_timeout_delay=180;
 
 function(this_program:void) request_callback;
+function(this_program,array:void) error_callback;
 
 void attach_fd(Stdio.File _fd, Port server,
 	       function(this_program:void) _request_callback,
-	       void|string already_data)
+	       void|string already_data,
+	       void|function(this_program,array:void) _error_callback)
 {
    my_fd=_fd;
    server_port=server;
    headerparser = .HeaderParser();
    request_callback=_request_callback;
+   error_callback = _error_callback;
 
    my_fd->set_nonblocking(read_cb,0,close_cb);
 
@@ -430,14 +433,18 @@ protected void finalize()
 {
   my_fd->set_blocking();
   flatten_headers();
-  parse_post();
-
-  if (request_headers->cookie)
-    foreach (request_headers->cookie/";";;string cookie)
-      if (sscanf(String.trim_whites(cookie),"%s=%s",string a,string b)==2)
-        cookies[a]=b;
-
-  request_callback(this);
+  if (array err = catch {parse_post();})
+  {
+    if (error_callback) error_callback(this, err);
+  }
+  else
+  {
+    if (request_headers->cookie)
+      foreach (request_headers->cookie/";";;string cookie)
+        if (sscanf(String.trim_whites(cookie),"%s=%s",string a,string b)==2)
+          cookies[a]=b;
+    request_callback(this);
+  }
 }
 
 // Adds incoming data to raw and buf. Once content-length or
@@ -742,7 +749,7 @@ void finish(int clean)
    // create new request
 
    this_program r=this_program();
-   r->attach_fd(my_fd,server_port,request_callback,buf);
+   r->attach_fd(my_fd,server_port,request_callback,buf,error_callback);
 
    my_fd=0; // and drop this object
 }