예제 #1
0
        public void process()
        {
            // we can't use a StreamReader for input, because it buffers up extra data on us inside it's
            // "processed" view of the world, and we want the data raw after the headers
            inputStream = new BufferedStream(socket.GetStream());

            // we probably shouldn't be using a streamwriter for all output from handlers either
            outputStream = new StreamWriter(new BufferedStream(socket.GetStream()));
            try
            {
                parseRequest();
                readHeaders();
                if (http_method.Equals("GET"))
                {
                    handleGETRequest();
                }
                else if (http_method.Equals("POST"))
                {
                    handlePOSTRequest();
                }
            }
            catch (Exception e)
            {
                MoaLog.Debug(String.Format("Exception: {0}", e.ToString()));
                writeFailure();
            }
        }
예제 #2
0
        public void readHeaders()
        {
            MoaLog.Debug(String.Format("readHeaders()"));
            String line;

            while ((line = streamReadLine(inputStream)) != null)
            {
                if (line.Equals(""))
                {
                    MoaLog.Debug(String.Format("got headers"));
                    return;
                }

                int separator = line.IndexOf(':');
                if (separator == -1)
                {
                    throw new Exception("invalid http header line: " + line);
                }
                String name = line.Substring(0, separator);
                int    pos  = separator + 1;
                while ((pos < line.Length) && (line[pos] == ' '))
                {
                    pos++; // strip any spaces
                }

                string value = line.Substring(pos, line.Length - pos);
                MoaLog.Debug(String.Format("header: {0}:{1}", name, value));
                http_req_headers[name] = value;
            }
        }
예제 #3
0
        public override void handlePOSTRequest(HttpProcessor p, StreamReader inputData)
        {
            MoaLog.Debug(String.Format("POST request: {0}", p.http_url));
            string data = inputData.ReadToEnd();

            p.writeSuccess();
            p.outputStream.WriteLine("<html><body><h1>test server</h1>");
            p.outputStream.WriteLine("<a href=/test>return</a><p>");
            p.outputStream.WriteLine("postbody: <pre>{0}</pre>", data);
        }
예제 #4
0
        public void parseRequest()
        {
            String request = streamReadLine(inputStream);

            string[] tokens = request.Split(' ');
            if (tokens.Length != 3)
            {
                throw new Exception("invalid http request line");
            }
            http_method = tokens[0].ToUpper();
            http_url    = tokens[1];
            http_protocol_versionstring = tokens[2];

            MoaLog.Debug(String.Format("starting: {0}", request));
        }
예제 #5
0
        public void handlePOSTRequest()
        {
            // this post data processing just reads everything into a memory stream.
            // this is fine for smallish things, but for large stuff we should really
            // hand an input stream to the request processor. However, the input stream
            // we hand him needs to let him see the "end of the stream" at this content
            // length, because otherwise he won't know when he's seen it all!

            MoaLog.Debug(String.Format("get post data start"));
            int          content_len = 0;
            MemoryStream ms          = new MemoryStream();

            if (this.http_req_headers.ContainsKey("Content-Length"))
            {
                content_len = Convert.ToInt32(this.http_req_headers["Content-Length"]);
                if (content_len > MAX_POST_SIZE)
                {
                    throw new Exception(
                              String.Format("POST Content-Length({0}) too big for this simple server",
                                            content_len));
                }
                byte[] buf     = new byte[BUF_SIZE];
                int    to_read = content_len;
                while (to_read > 0)
                {
                    MoaLog.Debug(String.Format("starting Read, to_read={0}", to_read));

                    int numread = this.inputStream.Read(buf, 0, Math.Min(BUF_SIZE, to_read));
                    MoaLog.Debug(String.Format("read finished, numread={0}", numread));
                    if (numread == 0)
                    {
                        if (to_read == 0)
                        {
                            break;
                        }
                        else
                        {
                            throw new Exception("client disconnected during post");
                        }
                    }
                    to_read -= numread;
                    ms.Write(buf, 0, numread);
                }
                ms.Seek(0, SeekOrigin.Begin);
            }
            MoaLog.Debug(String.Format("get post data end"));
            srv.handlePOSTRequest(this, new StreamReader(ms));
        }
예제 #6
0
        public override void handleGETRequest(HttpProcessor p)
        {
            if (p.http_url.Equals("/Test.png"))
            {
                Stream fs = File.Open("../../Test.png", FileMode.Open);

                p.writeSuccess("image/png");
                fs.CopyTo(p.outputStream.BaseStream);
                p.outputStream.BaseStream.Flush();
            }

            MoaLog.Debug(String.Format("request: {0}", p.http_url));
            p.writeSuccess();
            p.outputStream.WriteLine("<html><body><h1>test server</h1>");
            p.outputStream.WriteLine("Current Time: " + DateTime.Now.ToString());
            p.outputStream.WriteLine("url : {0}", p.http_url);

            p.outputStream.WriteLine("<form method=post action=/form>");
            p.outputStream.WriteLine("<input type=text name=foo value=foovalue>");
            p.outputStream.WriteLine("<input type=submit name=bar value=barvalue>");
            p.outputStream.WriteLine("</form>");
        }