Comments (7)
+1
from pistache.
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.
@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.
@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.
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.
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.
we could add the Pipeline feature to project task and close this issue.
from pistache.
Related Issues (20)
- My REST API server just crashes leaving no backtrace HOT 5
- Unit testing of individual routes/path - Too many responsibilities of Pistache::Http::ResponseWriter HOT 1
- Swagger UI CORS problem
- Crashed with std::runtime_error - bad file descriptor HOT 11
- Data race in Pistache::Http::Experimental::Client HOT 2
- Want to contribute by building the documentation site for pistache HOT 2
- Getting SIGILL with gcc12 HOT 11
- Memory corruption when using the server in multi-threaded mode. HOT 6
- serveFile crashes if passed-by-reference fileName parameter goes out of scope HOT 8
- WriteEntry Constructor called with Incorrect Parameters in Transport::asyncWriteImpl
- [BUG] ResponseWriter::setCompression() chokes on identity encoding
- [BUG] Fails to fetch build dependencies in autopkgtest HOT 7
- [BUG] All PPA builds failing due to missing zlib headers
- [BUG] New compression code fails to build on armhf HOT 5
- decode uri
- Complete BSD support HOT 4
- "Stack smashing detected" error in ubuntu docker container HOT 17
- New release to conan HOT 1
- keep alive timeout doesn't add to response header
- Pistache very poor performance when POST size exceeds `Endpoint::options().maxRequestSize()`, and `maxRequestSize` is large. HOT 4
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from pistache.