コード例 #1
0
    private void Process(HttpListenerContext context)
    {
        int sessionId = 0;

        if (context.Request.Cookies["id"] != null)
        {
            if (context.Request.Cookies["id"].Expired ||
                !Int32.TryParse(context.Request.Cookies["id"].Value, out sessionId))
            {
                sessionId = 0;
            }
            if (sessionId >= _sessions.Count)
            {
                sessionId = 0;
            }
        }
        if (sessionId == 0)
        {
            for (int i = 1; i < _sessions.Count; i++)
            {
                if (_sessions[i].time.CompareTo(DateTime.Now) < 0)
                {
                    sessionId = i;
                }
            }
            if (sessionId == 0)
            {
                _sessions.Add(new SessionInfo());
                sessionId = _sessions.Count - 1;
            }
        }
        _sessions[sessionId].id   = sessionId;
        _sessions[sessionId].time = DateTime.Now.AddHours(1);
        Cookie cookie = new Cookie("id", "" + sessionId);

        cookie.Expires = _sessions[sessionId].time;
        context.Response.Cookies.Add(cookie);

        string filename = context.Request.Url.AbsolutePath;

        Logger.Log("Get request:" + filename);
        filename = filename.Substring(1);

        if (string.IsNullOrEmpty(filename))
        {
            foreach (string indexFile in _indexFiles)
            {
                if (File.Exists(Path.Combine(_rootDirectory, indexFile)))
                {
                    filename = indexFile;
                    break;
                }
            }
        }

        //API行为
        string apiAtt = "api/";

        if (filename.IndexOf(apiAtt) == 0)
        {
            string[] cmd    = filename.Substring(apiAtt.Length).Split("_");
            string   result = null;
            switch (cmd[0])
            {
            case "GetList":
            {
                result = "应该返回LIST看不见这玩意";
                if (cmd.Length > 1)
                {
                }
                else
                {
                    result = ArchiveManager.GetList(3, 5);
                }
            }
            break;

            case "LoadManga":
            {
                if (cmd.Length < 2)
                {
                    result = "{\"result\":\"Failed\",\"message\":\"请求参数不足。\"}";
                }
                else
                {
                    int mangaId = 0;
                    if (Int32.TryParse(cmd[1], out mangaId))
                    {
                        result = "{\"result\":\"{0}\",\"message\":\"{1}\"}";
                        if (_sessions[sessionId].info == null || !_sessions[sessionId].info.thread.IsAlive)
                        {
                            _sessions[sessionId].info = ArchiveManager.StartUnarchive(mangaId, sessionId);
                            if (_sessions[sessionId].info == null)
                            {
                                result = result.Replace("{0}", "Failed");
                                result = result.Replace("{1}", "文件错误。");
                            }
                            else
                            {
                                result = result.Replace("{0}", "Success");
                                result = result.Replace("{1}", Path.GetFileName(_sessions[sessionId].info.archivePath));
                            }
                        }
                        else
                        {
                            if (_sessions[sessionId].info.thread.IsAlive)
                            {
                                result = result.Replace("{0}", "Busy");
                                result = result.Replace("{1}", "等会。");
                            }
                            else
                            {
                                result = result.Replace("{0}", "Failed");
                                result = result.Replace("{1}", "不应该的错误。");
                            }
                        }
                    }
                    else
                    {
                        result = "{\"result\":\"Failed\",\"message\":\"非法请求。\"}";
                    }
                }
            }
            break;

            case "CheckManga":
            {
                if (_sessions[sessionId].pagePaths == null)
                {
                    _sessions[sessionId].pagePaths = new List <string>();
                }
                _sessions[sessionId].pagePaths.Clear();
                if (_sessions[sessionId].info == null)
                {
                }
                foreach (string path in Directory.GetFiles(_sessions[sessionId].info.tempDirPath))
                {
                    if (ArchiveManager.isImage(path))
                    {
                        _sessions[sessionId].pagePaths.Add(path);
                    }
                }
                _sessions[sessionId].pagePaths.Sort();
                result = "{\"result\":\"{0}\",\"message\":\"{1}\"}";
                result = result.Replace("{1}", _sessions[sessionId].pagePaths.Count.ToString());
                if (_sessions[sessionId].info.thread.IsAlive)
                {
                    result = result.Replace("{0}", "Loading");
                }
                else if (_sessions[sessionId].info.success)
                {
                    result = result.Replace("{0}", "Success");
                }
                else
                {
                    result = result.Replace("{0}", "Failed");
                }
            }
            break;

            case "GetPage":
            {
                int page = 0;
                if (cmd.Length >= 2)
                {
                    if (Int32.TryParse(cmd[1], out page))
                    {
                        if (page >= 0 && page < _sessions[sessionId].pagePaths.Count)
                        {
                            ServeFile(context, _sessions[sessionId].pagePaths[page]);
                        }
                    }
                }
            }
            break;

            case "ShutDown":
            {
                //不知道为啥GetContext不管是Stop Abort都会阻塞,又不让我强行停线程……反正也要做Web端就写成web api吧
                result = "溜了";
                _cts.Cancel();
            }
            break;
            }
            if (result != null)
            {
                try
                {
                    byte[] resultByte = Encoding.UTF8.GetBytes(result);
                    context.Response.ContentType     = "text/plain";
                    context.Response.ContentLength64 = resultByte.Length;
                    context.Response.OutputStream.Write(resultByte, 0, resultByte.Length);
                    context.Response.StatusCode = (int)HttpStatusCode.OK;
                    context.Response.OutputStream.Flush();
                }
                catch (Exception ex)
                {
                    context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                    Logger.Log(ex.ToString());
                }
            }
        }
        else
        {
            //一般获取文件
            filename = Path.Combine(_rootDirectory, filename);
            ServeFile(context, filename);
        }
        context.Response.AddHeader("Server", "AeroMangaManager/0.1");
        context.Response.OutputStream.Close();
    }