1

i am trying to build simple web server, that able to transfer files.
I know, there is a lot of examples, but most of them too complex to understand for someone who never worked with HTTP
So i have...

    public Hashtable MimeTypes = new Hashtable();

    public HttpServer(int port)
    {
        this.port = port;

        MimeTypes.Add("html", "text/html");
        MimeTypes.Add("htm", "text/html");
        MimeTypes.Add("css", "text/css");
        MimeTypes.Add("js", "application/x-javascript");

        MimeTypes.Add("png", "image/png");
        MimeTypes.Add("gif", "image/gif");
        MimeTypes.Add("jpg", "image/jpeg");
        MimeTypes.Add("jpeg", "image/jpeg");
    }

    public void writeSuccess(string mime_type, string file_name, int file_size)
    {
        outputStream.Write("HTTP/1.0 200 OK\n");
        outputStream.Write("Content-Type: " + mime_type + "\n");

        if (file_name != null)//if file name isn't null, this mean we need to add additional headers
        {
            outputStream.Write("Content-Disposition: attachment; filename=" + file_name);
            outputStream.Write("Content-Length: " + file_size);
        }

        outputStream.Write("Connection: close\n");
        outputStream.Write("\n");
    }

public override void handleGETRequest(HttpProcessor p)
{
    Console.WriteLine("request: {0}", p.http_url);

    byte[] file_content = null;

    try { file_content = File.ReadAllBytes(work_folder + p.http_url); } //tring to read requested file
    catch (Exception exc) { p.writeFailure(); return; } //return failure if no such file

    string[] splitted_html_url = p.http_url.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries ); //splitting url for future format check

    string mime_type = "application/octet-stream"; //the most generic type

    if (MimeTypes.Contains(splitted_html_url[splitted_html_url.Length - 1]))
        mime_type = (string)MimeTypes[splitted_html_url[splitted_html_url.Length - 1]]; //set mimy type that math to requested file format

    if (mime_type.Contains("image") || mime_type == "application/octet-stream") //hacky thing for tests...
        p.writeSuccess(mime_type, p.http_url.Remove(0, 1), file_content.Length); //if mime type is image or unknown, than pass file name and length to responce builder
    else
        p.writeSuccess(mime_type, null, 0); //er else just add general headers

    p.outputStream.Write(Encoding.ASCII.GetString(file_content)); //write file content after headers
}

It works for HTML transfers, but i can't make it transfer images :(
If i make html page with this tag:

<img src = "logo225x90.gif" width = "100%" height = "100%" />

and place this file to right directory, it still showed in browser as missing file

Kosmo零
  • 4,001
  • 9
  • 45
  • 88

1 Answers1

3

I think you are making multiple mistakes.

  • You are assuming that you can avoid all the complexity of the example code.
  • Instead of pasting your code and make somebody do your work you should educate yourself about HTTP - it shouldn't be too hard for the scope of your task
  • You are writing code to do something which can be done by IIS which runs your code (if you run your code on IIS)
  • You are writing the file as string with p.outputStream.Write(Encoding.ASCII.GetString(file_content)); //write file content after headers

I suggest:

Community
  • 1
  • 1
tymtam
  • 31,798
  • 8
  • 86
  • 126
  • 1
    1. I successed to avoid all the complexity, and modified source code that was able to send only static generated by code pages to code that able to send read from HDD files 2. I never asked somebody to do my job, i just asked what's wrong? 3. I need embedded http server in my main application that don't have any connections with IIS and i don't want to make users install IIS to run my application. 4. Thanks, this is everything i wanted to know – Kosmo零 Aug 02 '12 at 16:09