[Mono-bugs] [Bug 577891] New: HttpListener incorrect headers parsing under moderate load

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Mon Feb 8 06:58:21 EST 2010


http://bugzilla.novell.com/show_bug.cgi?id=577891

http://bugzilla.novell.com/show_bug.cgi?id=577891#c0


           Summary: HttpListener incorrect headers parsing under moderate
                    load
    Classification: Mono
           Product: Mono: Class Libraries
           Version: 2.6.x
          Platform: x86
        OS/Version: openSUSE 11.2
            Status: NEW
          Severity: Major
          Priority: P5 - None
         Component: System
        AssignedTo: mono-bugs at lists.ximian.com
        ReportedBy: vadmyst at gmail.com
         QAContact: mono-bugs at lists.ximian.com
          Found By: ---
           Blocker: ---


Created an attachment (id=341241)
 --> (http://bugzilla.novell.com/attachment.cgi?id=341241)
HttpListener Server Sample With Headers Dumps

User-Agent:       Mozilla/5.0 (Windows; U; Windows NT 5.2; ru; rv:1.9.1.7)
Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)

When using HttpListener from System.Net namespace I encounter strange bug with
HTTP headers parsing. 

It appears that when HttpListner is operating under some load and HTTP request
data is received in small chunks - headers parsing goes wild. For example, 
Client sends request to the HttpListener with following headers:
User-Agent: Test
header1: value1,value2
header2: value1,value2
header3: value1
header4: value1

On server side headers are parsed out into following mess:
User-Agent: Test
header1: value1,value2header1: value1,value2header1: value1,value2
header2: value1,value2header2: value1,value2
header3: value1header2: value1,value2header2: value1,value2

Hint: it appears that HttpListener parsing logic does not expect to receive
single single byte chunks of header separators.


Reproducible: Sometimes

Steps to Reproduce:
1.Start HttpListener and dump headers of every request
2.Start client that sends HTTP requests and reads response in a loop
3.After some while headers on the server side will be messed up




Expected Results:  
Headers should be parsed correctly: headers send by the client should be the
same on the server side

I've included server and client samples that can be used to reproduce the bug
Server:
class Program
    {
        static void Main(string[] args)
        {
            HttpListener httpLst = new HttpListener();

            httpLst.Prefixes.Add("http://*:15555/test/");
            httpLst.AuthenticationSchemes = AuthenticationSchemes.Anonymous | 
                AuthenticationSchemes.None;

            httpLst.Start();
            Thread th = new Thread(
                delegate()
                {
                    try
                    {
                        HttpListenerContext lstCtx = null;
                        while ((lstCtx = httpLst.GetContext()) != null)
                        {
                            Console.WriteLine("Begin request
======================");

                            foreach (string header in
lstCtx.Request.Headers.AllKeys)
                            {
                                foreach (string val in
lstCtx.Request.Headers.GetValues(header))
                                {
                                    Console.WriteLine(header + ": " + val);
                                }
                            }

                            lstCtx.Response.StatusCode = 204;
                            lstCtx.Response.Close();

                            Console.WriteLine("End request
========================");
                            Console.WriteLine();

                        }
                    }
                    catch (Exception ex) { Console.WriteLine(ex); }
                });
            th.Start();

            Console.ReadLine();

            httpLst.Stop();
            httpLst.Close();
        }
    }

Client:
class Program
    {
        const char CR = '\r';
        const char LF = '\n';

        static void WriteHttpLineDelayed(string content, StreamWriter writer)
        {
            writer.Write(content);
            writer.Flush();
            writer.Write(CR);
            writer.Flush();
            writer.Write(LF);
            writer.Flush();
        }

        static void Main(string[] args)
        {
            string address = "10.2.2.105";
            int port = 15555;

            while (true)
            {
                TcpClient client = new TcpClient();
                client.Connect(address, port);

                using (StreamWriter writer = new 
StreamWriter(client.GetStream()))
                {
                    WriteHttpLineDelayed("GET /test/testme HTTP/1.0", writer);
                    WriteHttpLineDelayed("User-Agent: Test", writer);

                    WriteHttpLineDelayed("header1: value1,value2", writer);
                    WriteHttpLineDelayed("header2: value1,value2", writer);
                    WriteHttpLineDelayed("header3: value1,value2", writer);
                    WriteHttpLineDelayed("header4: value1,value2", writer);
                    WriteHttpLineDelayed("header5: value1", writer);
                    WriteHttpLineDelayed("header6: value1", writer);
                    WriteHttpLineDelayed("header7: value1", writer);
                    WriteHttpLineDelayed("header8: value1", writer);

                    WriteHttpLineDelayed(string.Format("Host: {0}:{1}",
address, port), writer);

                    writer.Write(CR);
                    writer.Flush();
                    writer.Write(LF);
                    writer.Flush();

                    StreamReader reader = new StreamReader(client.GetStream());

                    string response = reader.ReadLine();
                }
            }
        }
    }

-- 
Configure bugmail: http://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
You are the assignee for the bug.


More information about the mono-bugs mailing list