Question

So I'm back with another question about my web server. I've added several new features to it since my last question, but now I've ran into another problem.

I'm trying to allow the server to serve out an image that is called through HTML. However, the image isn't displaying on the webpage for some reason. I've stepped through the code and it does seem to be sending through the file, but it's just not displaying on the other end. Here is my code:

using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Threading;

namespace miniWebServer_csc360
{
    public partial class Form1 : Form
    {
        public static int requestCount = 0;
        public static Boolean singleUse = true;

        public static HttpListener listener = new HttpListener();

        //public static HttpListenerContext context;
        //public static HttpListenerResponse response;

        static Form1 thisform;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            thisform = this;
        }

        private void start_button_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(serverThread);
            t.Start();
        }

        public static void serverThread()
        {
            if (singleUse)
            {
                listener.Prefixes.Add("http://10.211.55.4:69/");
                listener.Prefixes.Add("http://localhost:69/");

                singleUse = false;
            }

            if (listener.IsListening)
                listener.Stop();

            else
                listener.Start();

            if (listener.IsListening)
            {
                thisform.Invoke((MethodInvoker)delegate { thisform.status_label.Text 
                   = "Listening..."; });
                thisform.Invoke((MethodInvoker)delegate { thisform.start_button.Text 
                   = "Stop Server"; });
            }

            else
            {
                thisform.Invoke((MethodInvoker)delegate { thisform.status_label.Text 
                   = "Not listening..."; });
                thisform.Invoke((MethodInvoker)delegate { thisform.start_button.Text 
                   = "Start Server"; });
            }

            while (listener.IsListening)
            {
                try
                {
                    HttpListenerContext context = listener.GetContext();
                    HttpListenerResponse response = context.Response;

                    requestCount++;

                    thisform.Invoke((MethodInvoker)delegate { thisform.counter.Text 
                       = requestCount.ToString(); });

                    string page = Directory.GetCurrentDirectory() 
                        + context.Request.Url.LocalPath;

                    if (context.Request.Url.LocalPath != "/HEAD.html" 
                         && context.Request.Url.LocalPath != "/favicon.ico")
                    {
                        if (context.Request.Url.LocalPath == "/")
                        {
                            string path = context.Request.Url.LocalPath + "index.html";
                                 thisform.Invoke((MethodInvoker)delegate
                            {
                                thisform.request_Box.AppendText(path + "\r\n");
                            });
                        }

                        else
                        {
                            thisform.Invoke((MethodInvoker)delegate
                            {
                                thisform.request_Box.AppendText
                                  (context.Request.Url.LocalPath + "\r\n");
                            });
                        }
                    }

                    if (context.Request.Url.LocalPath == "/")
                        page += "index.html";

                    TextReader tr = new StreamReader(page);
                    string msg = tr.ReadToEnd();

                    byte[] buffer = Encoding.UTF8.GetBytes(msg);

                    if (context.Request.Url.LocalPath == "/header.html")
                    {
                        File.WriteAllText(Directory.GetCurrentDirectory() + "/HEAD.html",
                            context.Request.HttpMethod + " " +
                            context.Request.RawUrl + " HTTP/" 
                            + context.Request.ProtocolVersion + "\n"
                            + context.Request.Headers.ToString());
                    }

                    response.ContentLength64 = buffer.Length;
                    Stream st = response.OutputStream;
                    st.Write(buffer, 0, buffer.Length);

                    context.Response.Close();
                }
                catch (Exception error)
                {

                }
            }
        }
    }
}

Thanks in advance!

Was it helpful?

Solution

You have to set HttpListenerResponse.ContentType to the appropriate MIME type for the image, such as "image/gif".

In addition, the example code is reading the image through a TextReader and converting it to a UTF8 byte array. That's not going to work for binary files; it'll mangle the bytes. You need to read those files with a FileStream or any other approach that will return the binary file contents unmodified.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top