Ejemplo n.º 1
0
        // handle exception based on the enum type status, and interpolate the exception message.
        static RDJTPResponse HandleException(RDJTPStatus state, string msg = "")
        {
            var response = new RDJTPResponse();

            switch (state)
            {
            case RDJTPStatus.Not_Found:
                response.Status = "5 Not Found";
                break;

            case RDJTPStatus.Bad_Request:

                if (msg != "")
                {
                    response.Status = $"4 Bad Request {msg}";
                }
                else
                {
                    response.Status = "4 Bad Request";
                }

                break;

            case RDJTPStatus.Error:
                response.Status = "6 Error";
                break;

            default:
                response.Status = "6 Error";
                break;
            }

            return(response);
        }
Ejemplo n.º 2
0
        static void Respond(NetworkStream strm, RDJTPResponse resp)
        {
            var jsonresponse = JsonConvert.SerializeObject(resp);
            var payload      = Encoding.UTF8.GetBytes(jsonresponse);

            strm.Write(payload, 0, payload.Length);
        }
Ejemplo n.º 3
0
        // no need for checks. just return body.
        static RDJTPResponse HandleEcho(RDJTPRequest req)
        {
            var response = new RDJTPResponse()
            {
                Status = "1 OK", Body = req.Body
            };

            return(response);
        }
Ejemplo n.º 4
0
        static RDJTPResponse HandleRead(RDJTPRequest req, List <Category> categories)
        {
            var response = new RDJTPResponse();

            var path = req.Path.Split("/");

            // if only 3 elements exists in path, we have /api/categories
            // if over, we have /api/categories/<id>
            if (path.Length < 4)
            {
                response.Status = "1 Ok";
                response.Body   = JsonConvert.SerializeObject(categories);
                return(response);
            }
            else
            {
                response.Status = "1 Ok";
                int cid;

                // path[3] is id - try to parse
                if (!int.TryParse(path[3], out cid))
                {
                    return(HandleException(RDJTPStatus.Bad_Request));
                }

                var element = categories.Find(x => x.cid == cid);

                if (element == null)
                {
                    return(HandleException(RDJTPStatus.Not_Found));
                }

                response.Body = JsonConvert.SerializeObject(element);
                return(response);
            }
        }
Ejemplo n.º 5
0
        static void Main(string[] args)
        {
            var port = 5000;
            var ip   = IPAddress.Parse("127.0.0.1");


            var server = new TcpListener(ip, port);

            server.Start();
            Console.WriteLine("server started...");

            // init - state
            var cat1 = new Category()
            {
                cid = 1, name = "Beverages"
            };
            var cat2 = new Category()
            {
                cid = 2, name = "Condiments"
            };
            var cat3 = new Category()
            {
                cid = 3, name = "Confections"
            };

            var categories = new List <Category>()
            {
                cat1, cat2, cat3
            };

            var typesOfMethods = new List <string>()
            {
                "create", "update", "delete", "read", "echo"
            };

            while (true)
            {
                var client = server.AcceptTcpClient();

                // create new task for each client
                Task.Run(() =>
                {
                    var expmsg = "";

                    Console.WriteLine("client connected!");
                    var strm = client.GetStream();

                    var buffer = new byte[client.ReceiveBufferSize];

                    var reqContent = strm.Read(buffer, 0, buffer.Length);

                    var request = Encoding.UTF8.GetString(buffer, 0, reqContent);



                    expmsg = CheckMissing(request);


                    // if expmsg is not null or empty, an exception occured.
                    if (!string.IsNullOrEmpty(expmsg))
                    {
                        Respond(strm, HandleException(RDJTPStatus.Bad_Request, expmsg));
                        strm.Close();
                        return;
                    }



                    // parsing request
                    var rdjtpReq = ParseRequest(request);



                    expmsg = CheckDate(rdjtpReq);

                    // if expmsg is not null or empty, an exception occured.
                    if (!string.IsNullOrEmpty(expmsg))
                    {
                        Respond(strm, HandleException(RDJTPStatus.Bad_Request, expmsg));
                        strm.Close();
                        return;
                    }



                    if (!CheckRequest(rdjtpReq))
                    {
                        var msg = CheckResource(rdjtpReq);
                        Respond(strm, HandleException(RDJTPStatus.Bad_Request, $"missing resource {msg}"));
                        strm.Close();
                        return;
                    }



                    if (!typesOfMethods.Contains(rdjtpReq.Method))
                    {
                        Respond(strm, HandleException(RDJTPStatus.Bad_Request, "illegal method"));
                        strm.Close();
                        return;
                    }



                    if (!CheckRoute(rdjtpReq))
                    {
                        var expresponse = HandleException(RDJTPStatus.Not_Found);

                        var path = rdjtpReq.Path.Split("/");

                        if (path.Length < 3)
                        {
                            expresponse = HandleException(RDJTPStatus.Bad_Request);
                            Respond(strm, expresponse);
                            strm.Close();
                            return;
                        }

                        if (path[1] != "api" || path[2] != "categories")
                        {
                            expresponse = HandleException(RDJTPStatus.Bad_Request);
                            Respond(strm, expresponse);
                            strm.Close();
                            return;
                        }

                        if (rdjtpReq.Body == null)
                        {
                            expresponse.Status += " missing body";
                        }

                        Respond(strm, expresponse);
                        strm.Close();
                        return;
                    }



                    // success up until now
                    var response = new RDJTPResponse();
                    switch (rdjtpReq.Method)
                    {
                    case "create":
                        response = HandleCreate(rdjtpReq, categories);
                        break;

                    case "update":
                        response = HandleUpdate(rdjtpReq, categories);
                        break;

                    case "delete":
                        response = HandleDelete(rdjtpReq, categories);
                        break;

                    case "echo":
                        response = HandleEcho(rdjtpReq);
                        break;

                    case "read":
                        response = HandleRead(rdjtpReq, categories);
                        break;

                    default:
                        response = HandleException(RDJTPStatus.Error);
                        break;
                    }
                    Respond(strm, response);
                    strm.Close();
                });
            }
        }