summaryrefslogtreecommitdiffstats
path: root/lib/libUPnP/Neptune/Source/Apps/MiniHttpServer/MiniHttpServer.cpp
blob: 59afba5b5f717c157673a39339a72bf2d81dd97f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/*****************************************************************
|
|      Mini HTTP Server
|
|      (c) 2001-2009 Gilles Boccon-Gibod
|      Author: Gilles Boccon-Gibod (bok@bok.net)
|
 ****************************************************************/

/*----------------------------------------------------------------------
|       includes
+---------------------------------------------------------------------*/
#include "Neptune.h"


/*----------------------------------------------------------------------
|   MiniServer
+---------------------------------------------------------------------*/
static void
MiniServer(const char* root, unsigned int port, bool verbose)
{
    NPT_HttpServer            server(port);
    NPT_InputStreamReference  input;
    NPT_OutputStreamReference output;
    NPT_HttpRequestContext    context;

    NPT_HttpFileRequestHandler* file_handler = new NPT_HttpFileRequestHandler("/", root, true);
    server.AddRequestHandler(file_handler, "/", true);

    for (;;) {
        if (verbose) NPT_Console::Output("waiting for connection...\n");
        NPT_Result result = server.WaitForNewClient(input, 
                                                    output,
                                                    &context);
        if (verbose) NPT_Console::OutputF("WaitForNewClient returned %d (%s)\n", result, NPT_ResultText(result));
        if (NPT_FAILED(result)) return;

        result = server.RespondToClient(input, output, context);
        if (verbose) NPT_Console::OutputF("RespondToClient returned %d (%s)\n", result, NPT_ResultText(result));
        
        input = NULL;
        output = NULL;
    } 

    delete file_handler;
}

/*----------------------------------------------------------------------
|       main
+---------------------------------------------------------------------*/
int
main(int /*argc*/, char** argv)
{
    NPT_String   file_root;
    unsigned int port    = 8000;
    bool         verbose = false;
    
    while (const char* arg = *++argv) {
        if (NPT_StringsEqual(arg, "--help") ||
            NPT_StringsEqual(arg, "-h")) {
            NPT_Console::Output("usage: minihttpserver [--file-root <dir>] [--port <port>] [--verbose]\n");
            return 0;
        } else if (NPT_StringsEqual(arg, "--file-root")) {
            arg = *++argv;
            if (arg == NULL) {
                NPT_Console::Output("ERROR: missing argument for --root option\n");
                return 1;
            }
            file_root = arg;
        } else if (NPT_StringsEqual(arg, "--port")) {
            arg = *++argv;
            if (arg == NULL) {
                NPT_Console::Output("ERROR: missing argument for --port option\n");
                return 1;
            }
            NPT_ParseInteger(arg, port, true);
        } else if (NPT_StringsEqual(arg, "--verbose")) {
            verbose = true;
        }
    }
    
    if (file_root.GetLength() == 0) {
        NPT_File::GetWorkingDir(file_root);
    }
    
    if (verbose) {
        NPT_Console::OutputF("Starting server on port %d, root=%s\n", port, file_root.GetChars());
    }
    MiniServer(file_root, port, verbose);
    
    return 0;
}