Ejemplo n.º 1
0
    /// <summary>
    /// リクエスト処理スレッド
    /// </summary>
    /// <param name="context"></param>
    private void RequestWorker(object param)
    {
        HttpListenerContext httpContext = (HttpListenerContext)param;
        HttpListenerRequest httpRequest = httpContext.Request;
        HttpListenerResponse httpResponse = httpContext.Response;

        //生リクエストを表示
        LogWrite("[request] " + httpRequest.RawUrl);

        string[] query = httpRequest.RawUrl.Split('/');

        string externalResponseText = null;
        //メソッド呼び出しの場合はイベントを発生
        if (query[1] == MethodNamespace && query.Length > 2 && ExternalAccessEnable)
        {
            ExternalMethodArgs e = new ExternalMethodArgs();
            string[] methodQuery = new string[query.Length - 2];
            for (int i = 2; i < query.Length; i++)
            {
                methodQuery[i - 2] = query[i];
            }
            e.query = methodQuery;
            e.response = null;
            externalResponseText = OnExternalMethod(e);
        }

        //拡張メソッドの戻り値があればレスポンスを返す
        if (externalResponseText != null)
        {
            httpResponse.StatusCode = 200;
            byte[] httpResponseBytes = StringToBytes(externalResponseText);
            httpResponse.OutputStream.Write(httpResponseBytes, 0, httpResponseBytes.Length);
        }
        else
        {
            //拡張メソッド外応答
            string path = DocumentRoot + httpRequest.RawUrl.Replace("/", pathSplitter);
            if (FileAccessEnable)
            {
                //ファイルが無ければ404
                if (File.Exists(path))
                {
                    httpResponse.StatusCode = 200;
                }
                else
                {
                    httpResponse.StatusCode = 404;
                    path = TemplateDirectory + DEFAULT_404_PAGE;
                }
            }
            else
            {
                httpResponse.StatusCode = 403;
                path = TemplateDirectory + DEFAULT_403_PAGE;
            }

            //pathを確認し、ファイルが存在すればレスポンスを返す
            if (File.Exists(path))
            {
                byte[] content = File.ReadAllBytes(path);
                httpResponse.OutputStream.Write(content, 0, content.Length);
            }
            else
            {
                httpResponse.StatusCode = 500;
                byte[] httpResponseBytes = StringToBytes(InternalServerErrorMessage.Replace("$SERVER_NAME",ServerName) );
                httpResponse.OutputStream.Write(httpResponseBytes, 0, httpResponseBytes.Length);
            }
        }
        try{
            httpResponse.Close();
        }catch{
        }
    }
Ejemplo n.º 2
0
    protected virtual string OnExternalMethod(ExternalMethodArgs e)
    {
        if (ExternalMethod != null)
        {
            ExternalMethod(this, e);
        }

        return e.response;
    }