Giter VIP home page Giter VIP logo

Comments (7)

knadh avatar knadh commented on May 3, 2024

+1

from pistache.

oktal avatar oktal commented on May 3, 2024

Hello,

Yes, that indeed sounds like a great suggestion. Basically, we need filters.

We could have two kind of filters: before-filters and after-filters. before-filters will be executed before each requests and can read/write the request/response. after-filters will be executed after each requests and can also read and modify the response.

Now we need to come up with a good API for this, feel free to suggest something if you have any idea :)

from pistache.

knadh avatar knadh commented on May 3, 2024

@oktal How Go does its HTTP middleware may be a good idea here. They're just simple function wrappers, without the explicit need for having pre/post filter APIs.

from pistache.

oktal avatar oktal commented on May 3, 2024

@knadh could you provide an example on how Go is handling it ?

If you have a clear idea on how to design it as well as the API to provide, feel free to post it here so that we can discuss it

from pistache.

knadh avatar knadh commented on May 3, 2024

In Go, functions that satisfy http.Handler (which implements the function ServeHTTP(ResponseWriter, *Request)) can act as middleware. A middleware takes a handler and returns a handler (similar to pistache's (const Rest::Request& request, Http::ResponseWriter response)). Here's some pseudocode that illustrates this.

func enforcePOST(next http.Handler) http.Handler {
  return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    if r.Method != "POST" {
        http.Error(w, "Method not allowed", 405)
        return
    }

    // All good, continue the request.
    next.ServeHTTP(w, r)
  })
}

func validateUser(next http.Handler) http.Handler {
  return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    if r.Form.Get("user_id") != 1 {
        http.Error(w, "User is not authorized.", 403)
        return
    }

    // All good, continue the request.
    next.ServeHTTP(w, r)
  })
}

func helloHandler (w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello world! You got past the middleware filters")
})

// Bind the route.
http.Handle("/", validateUser(enforcePOST(helloHandler)))

Here, enforcePost() and validateUser() are middleware functions that can decide to fail or continue a request before it gets to the final handler, helloHandler(). Hope that makes sense.

from pistache.

oktal avatar oktal commented on May 3, 2024

Makes sense. We could have something similar in Pistache, some sort on Middleware concept. I personally would like to call it Pipeline but it's already a common term in the HTTP world so meh.

Anyway, I'll take some time to think about it. Let me know if you are interested in working on it. We could potentially join our effort and start development in a separate branch

from pistache.

mohsenomidi avatar mohsenomidi commented on May 3, 2024

we could add the Pipeline feature to project task and close this issue.

from pistache.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.