Exemplo n.º 1
0
        private async Task WriteResponseAsync(string request, ITcpSocketClient socket )
        {
            Stream writeStream = socket.WriteStream;
            IGWClient client = null;
            Dictionary<string, string> parameters = null;
            const string C_REPTYPE = "reptype";
            const string C_CONTENTTYPE_HTML = "text/html; charset=utf-8;";
            const string C_REPTYPE_XML = "xml";
            const string C_CONTENTTYPE_XML = "text/xml; charset=utf-8;";
#if JSON
            const string C_REPTYPE_JSON = "json"; 
            const string C_CONTENTTYPE_JSON = "application/json";
#endif

            
          

            const string C_HTTP_CODE_OK = "200";
            const string C_HTTP_CODE_BADREQUEST = "400";
            const string C_HTTP_CODE_NOTFOUND = "404";
            const string C_HTTP_CODE_INTERNAL_ERROR = "500";

            string httpCode = C_HTTP_CODE_OK;
            string httpCodeTest = "";
            string httpContent = "";
            string httpContentType = C_CONTENTTYPE_XML; // default XML
            

            // parse request to get client and parametres items
            RequestParse(request, out client, out parameters);

            if (client != null)
            {
                // check response format to use
                if (parameters != null && parameters.ContainsKey(C_REPTYPE))
                {
                    if (parameters[C_REPTYPE] == C_REPTYPE_XML)
                        httpContentType = C_CONTENTTYPE_XML;
#if JSON
                    else if (parameters[C_REPTYPE] == C_REPTYPE_JSON)
                        httpContentType = C_CONTENTTYPE_JSON;
#endif
                    else
                    {
                        client = null; // bad => simulate 400
                        httpCode = C_HTTP_CODE_BADREQUEST;                     
                    }
                }
            }
            else
            {
                httpCode = C_HTTP_CODE_NOTFOUND;
            }

            if (client != null)
            {
                // transfert request to client                
                GWClientResult ret = await client.ExecuteAsync(parameters);

                if (ret!= null)
                {
                    // contruct response
                    XElement xresult = new XElement("Result");
                    XElement xrequest = new XElement("Request");
                    XElement xresponse = new XElement("Response");

                    
                    xrequest.Add(new XElement("Uri", request));
                    xrequest.Add(new XElement("RemoteAddress", socket.RemoteAddress));
                    xrequest.Add(new XElement("RemotePort", socket.RemotePort));                    
                    XElement  xparams = new XElement("Parameters");
                    if (parameters != null)
                    {
                        foreach (var parmeter in parameters)
                        {
                            XElement xparam = new XElement("Parameter");
                            xparam.Add(new XAttribute("Key", parmeter.Key));
                            xparam.Add(new XElement("Value", parmeter.Value));
                            xparams.Add(xparam);
                        }
                    }
                    xrequest.Add(xparams);
                    

                    xresponse.Add(new XElement("Success", ret.Success ? "1" : "0"));
                    xresponse.Add(new XElement("Message", ret.Message));
                    xresponse.Add(ret.Data);

                    xresult.Add(xrequest);
                    xresult.Add(xresponse);
                    ret.Data.Add(new XAttribute("ClientName", client.Name));

                    if (httpContentType == C_CONTENTTYPE_XML)
                    {
                        XDeclaration decl = new XDeclaration("1.0", "UTF-8", null);
                        httpContent = decl.ToString() + "\r\n" + xresult.ToString();
                    }
#if JSON
                    else if (httpContentType == C_CONTENTTYPE_JSON)
                    {
                        httpContent = JsonConvert.SerializeObject(xresult);
                    }
#endif
                }
                else
                {
                    client = null;
                    httpCode = C_HTTP_CODE_INTERNAL_ERROR;

                }
            }



            // bad request or client not found
            if (client == null)
            {

                switch (httpCode)
                {
                    case C_HTTP_CODE_BADREQUEST:
                        httpCodeTest = "BAD RESQUEST"; break;
                    case C_HTTP_CODE_NOTFOUND:
                        httpCodeTest = "NOT FOUND"; break;
                    case C_HTTP_CODE_INTERNAL_ERROR:
                        httpCodeTest = "INTERNAL SERVER ERROR"; break;
                    default:
                        httpCodeTest = "UNKNWON CODE"; break;

                }
                httpContentType = C_CONTENTTYPE_HTML;
                httpContent = string.Format("<html><body>{0} - {1} : {2}</body></html>", httpCode, httpCodeTest, request);

            }

            // write response
            
            byte[] bodyArray = Encoding.UTF8.GetBytes(httpContent);
                
            string header = String.Format("HTTP/1.1 {0} OK\r\n" +
                                "Content-Length: {1}\r\n" +
                                "Content-Type: {2} \r\n" +
                                "Connection: close\r\n\r\n",
                                httpCode,
                                bodyArray.Length,
                                httpContentType);
            byte[] headerArray = Encoding.UTF8.GetBytes(header);            
            try
            {                
                await writeStream.WriteAsync(headerArray, 0, headerArray.Length);
                if (bodyArray.Length > 0)
                {                    
                    await writeStream.WriteAsync(bodyArray, 0, bodyArray.Length);
                }
                await writeStream.FlushAsync();
            }                
            catch (Exception ex)
            {
                _2BDebug.Output(ex);
            }                       
        }