lighttpd forum lighty > [HELP] Partial cookie written or read v 1.4.19//20 + FastCGI

Posted by Lisa Williams
on 23.10.2008 22:28
I put this on the new redmine forum but thought I'd put it here in case 
any of you have some suggestions.

 * Issue:
  We write at least two, and sometimes three cookies to a user's browser 
for
  each request we get.  We are running a Perl FastCGI application with 
~1.5 million
  requests per day per server.  We set and read the cookie with Perl's 
CGI methods -
  creating the cookie header string with the 'cookie' method and setting 
it with the
  'header' method.
  I've been tracking down problems with the cookies as read from users. 
Sometimes cookies
  contain parial data - othertimes they hold very odd data.
  This is a complete cookie example:
  488:2:63347047828:1:1:34:412:63347047828:1:2|
  They are 10 colon separated values followed by a pipe -
  so even if a value is undefined it would print a :: where the value 
should have been.
  We are seeing very odd cookie values that don't appear to be
  coming from a bug in our code such as:
  1031:
  367:1:63349336033:1:255:15:96:633493
  1123:1:63349302
  Here is a particularly odd one:
   , $Version=1

  I thought that this could be related to bug
  http://trac.lighttpd.net/trac/ticket/1628
  So I upgraded to 1.4.20, but the errors continue to happen.  I can 
tell that they aren't
  pre-upgrade cookies by looking at the timestamp in the cookies.
  Furthermore, I simplified the code so we only set one cookie per 
request and find that
  the problem still exists.

  *  Operating System (OS)
    openSUSE 10.3 (X86-64)
    VERSION = 10.3

  * Version of Lighttpd
    currently lighttpd/1.4.20
    but saw the same thing with lighttpd/1.4.19

  * What client you used (Browser, curl, etc.)
    I haven't been able to recreate on my own - these are user cookies 
I'm finding, I could track the browser but haven't done that yet... not 
sure if it's worth it.

  * Configuration you are using

<pre>
# lighttpd configuration file
#
# use it as a base for lighttpd 1.0.0 and above
#
# $Id: lighttpd.conf,v 1.7 2004/11/03 22:26:05 weigon Exp $

############ Options you really have to take care of 
####################

## modules to load
# at least mod_access and mod_accesslog should be loaded
# all other module should only be loaded if really neccesary
# - saves some time
# - saves memory
server.modules              = (
                               "mod_rewrite",
#                               "mod_redirect",
                               "mod_alias",
                               "mod_access",
#                               "mod_cml",
#                               "mod_trigger_b4_dl",
#                               "mod_auth",
#                               "mod_status",
#                               "mod_setenv",
                               "mod_fastcgi",
#                               "mod_proxy",
#                               "mod_simple_vhost",
#                               "mod_evhost",
#                               "mod_userdir",
                               "mod_cgi",
#                               "mod_compress",
#                               "mod_ssi",
#                               "mod_usertrack",
#                               "mod_expire",
#                               "mod_secdownload",
#                               "mod_rrdtool",
                                "mod_accesslog" )

## a static document-root, for virtual-hosting take look at the
## server.virtual-* options
server.document-root        = "/srv/www/htdocs/"

## where to send error-messages to
server.errorlog             = "/var/log/lighttpd/error.log"

# files to check for if .../ is requested
index-file.names            = ( "index.html")

## set the event-handler (read the performance section in the manual)
# server.event-handler = "freebsd-kqueue" # needed on OS X

# mimetype mapping
mimetype.assign             = (
  ".pdf"          =>      "application/pdf",
  ".sig"          =>      "application/pgp-signature",
  ".spl"          =>      "application/futuresplash",
  ".class"        =>      "application/octet-stream",
  ".ps"           =>      "application/postscript",
  ".torrent"      =>      "application/x-bittorrent",
  ".dvi"          =>      "application/x-dvi",
  ".gz"           =>      "application/x-gzip",
  ".pac"          =>      "application/x-ns-proxy-autoconfig",
  ".swf"          =>      "application/x-shockwave-flash",
  ".tar.gz"       =>      "application/x-tgz",
  ".tgz"          =>      "application/x-tgz",
  ".tar"          =>      "application/x-tar",
  ".zip"          =>      "application/zip",
  ".mp3"          =>      "audio/mpeg",
  ".m3u"          =>      "audio/x-mpegurl",
  ".wma"          =>      "audio/x-ms-wma",
  ".wax"          =>      "audio/x-ms-wax",
  ".ogg"          =>      "application/ogg",
  ".wav"          =>      "audio/x-wav",
  ".gif"          =>      "image/gif",
  ".jpg"          =>      "image/jpeg",
  ".jpeg"         =>      "image/jpeg",
  ".png"          =>      "image/png",
  ".xbm"          =>      "image/x-xbitmap",
  ".xpm"          =>      "image/x-xpixmap",
  ".xwd"          =>      "image/x-xwindowdump",
  ".css"          =>      "text/css",
  ".html"         =>      "text/html",
  ".htm"          =>      "text/html",
  ".js"           =>      "text/javascript",
  ".asc"          =>      "text/plain",
  ".c"            =>      "text/plain",
  ".cpp"          =>      "text/plain",
  ".log"          =>      "text/plain",
  ".conf"         =>      "text/plain",
  ".text"         =>      "text/plain",
  ".txt"          =>      "text/plain",
  ".dtd"          =>      "text/xml",
  ".xml"          =>      "text/xml",
  ".mpeg"         =>      "video/mpeg",
  ".mpg"          =>      "video/mpeg",
  ".mov"          =>      "video/quicktime",
  ".qt"           =>      "video/quicktime",
  ".avi"          =>      "video/x-msvideo",
  ".asf"          =>      "video/x-ms-asf",
  ".asx"          =>      "video/x-ms-asf",
  ".wmv"          =>      "video/x-ms-wmv",
  ".bz2"          =>      "application/x-bzip",
  ".tbz"          =>      "application/x-bzip-compressed-tar",
  ".tar.bz2"      =>      "application/x-bzip-compressed-tar",
  # default mime type
  ""              =>      "application/octet-stream",
 )

# Use the "Content-Type" extended attribute to obtain mime type if 
possible
#mimetype.use-xattr        = "enable"

## send a different Server: header
## be nice and keep it at lighttpd
# server.tag                 = "lighttpd"

#### accesslog module
accesslog.filename          = "/var/log/lighttpd/access.log"
accesslog.format = "%{Udm_Remote_Addr}i %V %u %t \"%r\" %>s %b 
\"%{Referer}i\" \"%{User-Agent}i\""

## deny access the file-extensions
#
# ~    is for backupfiles from vi, emacs, joe, ...
# .inc is often used for code includes which should in general not be 
part
#      of the document-root
url.access-deny             = ( "~", ".inc" )

$HTTP["url"] =~ "\.pdf$" {
  server.range-requests = "disable"
}

##
# which extensions should not be handle via static-file transfer
#
# .php, .pl, .fcgi are most often handled by mod_fastcgi or mod_cgi
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi", ".fetch", 
".cpx" )

######### Options that are good to be but not neccesary to be changed 
#######

## bind to port (default: 80)
server.port                = 80

## bind to localhost (default: all interfaces)
#server.bind                = "127.0.0.1"

## error-handler for status 404
#server.error-handler-404   = "/error-handler.html"
#server.error-handler-404   = "/error-handler.php"

## to help the rc.scripts
server.pid-file            = "/var/run/lighttpd.pid"

###### virtual hosts
##
##  If you want name-based virtual hosting add the next three settings 
and load
##  mod_simple_vhost
##
## document-root =
##   virtual-server-root + virtual-server-default-host + 
virtual-server-docroot
## or
##   virtual-server-root + http-host + virtual-server-docroot
##
#simple-vhost.server-root   = "/srv/www/vhosts/"
#simple-vhost.default-host  = "www.example.org"
#simple-vhost.document-root = "/htdocs/"

##
## Format: <errorfile-prefix><status-code>.html
## -> ..../status-404.html for 'File not found'
#server.errorfile-prefix    = "/usr/share/lighttpd/errors/status-"
#server.errorfile-prefix    = "/srv/www/errors/status-"

## virtual directory listings
#dir-listing.activate       = "enable"

## enable debugging
#debug.log-request-header   = "enable"
#debug.log-response-header  = "enable"
#debug.log-request-handling = "enable"
#debug.log-file-not-found   = "enable"

### only root can use these options
#
# chroot() to directory (default: no chroot() )
#server.chroot              = "/"

## change uid to <uid> (default: don't care)
server.username            = "lighttpd"

## change uid to <uid> (default: don't care)
server.groupname           = "lighttpd"

fastcgi.debug = 0

fastcgi.server= (".fetch" =>

   ("udmfoo" =>
      (
         "socket" => "/tmp/lighttpd-fcgi.socket",
         "bin-path" => "/srv/www/cgi-bin/img.fetch",
         "max-load-per-proc" => 3,
         "min-procs" => 4,
         "max-procs" => 8,
         "idle-timeout" => 60
         )
   )
)

#### CGI module
cgi.assign                 = ( ".pl"  => "/usr/bin/perl",
                               ".cgi" => "/usr/bin/perl",
                               ".cpx" => "/usr/bin/perl")

$SERVER["socket"] == ":443" {
  ssl.engine                  = "enable"
  ssl.pemfile                 = "/etc/cert/www_udmserve_net.pem"
  ssl.ca-file                 = "/etc/cert/DigiCertCA.crt"

  server.name                 = "udmserve.net"

  server.document-root        = "/srv/www/htdocs/"
}

                            )

#### url handling modules (rewrite, redirect, access)
#url.rewrite                = ( "^/$"             => "/server-status" )
# this line allows img.cpx calls to be pushed to the fcgi server, remove 
when we no longer need it
url.rewrite                = ( "^/udm/img.cpx(.*)$"  => 
"/udm/img.fetch$1" )

alias.url = ( "/udm/" => "/srv/www/cgi-bin/")

</pre>