Compare commits

...

3 Commits

Author SHA1 Message Date
64b5182f8b fix(doc): bad link
All checks were successful
Cadoles/bouncer/pipeline/head This commit looks good
2023-07-06 07:41:53 -06:00
ce2c19f9b3 feat(layer,queue): implement matchURLs option
All checks were successful
Cadoles/bouncer/pipeline/head This commit looks good
2023-07-05 13:54:01 -06:00
1ffec1f173 feat(layer,queue): prevent browser caching for queue page
All checks were successful
Cadoles/bouncer/pipeline/head This commit looks good
2023-07-05 13:35:21 -06:00
6 changed files with 31 additions and 4 deletions

View File

@ -19,5 +19,5 @@
### Développement ### Développement
- [(FR) - Démarrer avec les sources](./fr/tutorials/getting-start-with-sources.md) - [(FR) - Démarrer avec les sources](./fr/tutorials/getting-started-with-sources.md)
- [(FR) - Créer son propre layer](./fr/tutorials/create-custom-layer.md) - [(FR) - Créer son propre layer](./fr/tutorials/create-custom-layer.md)

View File

@ -22,6 +22,14 @@ Ce layer permet d'ajouter un mécanisme de file d'attente dynamique au proxy ass
- **Valeur par défaut:** `1m` - **Valeur par défaut:** `1m`
- **Description:** Durée de vie d'une session dans la file d'attente sans activité avant expiration. - **Description:** Durée de vie d'une session dans la file d'attente sans activité avant expiration.
### `matchURLs`
- **Type:** `[]string`
- **Valeur par défaut:** `["*"]`
- **Description:** Limiter l'action de la file d'attente à cette liste de patrons d'URLs.
Par exemple, si vous souhaitez limiter votre file à l'ensemble d'une section "`/blog`" d'un site, vous pouvez déclarer la valeur `["*/blog*"]`. Les autres URLs du site ne seront pas affectées par cette file d'attente.
### Schéma ### Schéma
Voir le [schéma JSON](../../../../internal/proxy/director/layer/queue/schema/layer-options.json). Voir le [schéma JSON](../../../../internal/proxy/director/layer/queue/schema/layer-options.json).

View File

@ -11,15 +11,15 @@ import (
type LayerOptions struct { type LayerOptions struct {
Capacity int64 `mapstructure:"capacity"` Capacity int64 `mapstructure:"capacity"`
Matchers []string `mapstructure:"matchers"`
KeepAlive time.Duration `mapstructure:"keepAlive"` KeepAlive time.Duration `mapstructure:"keepAlive"`
MatchURLs []string `mapstructure:"matchURLs"`
} }
func fromStoreOptions(storeOptions store.LayerOptions, defaultKeepAlive time.Duration) (*LayerOptions, error) { func fromStoreOptions(storeOptions store.LayerOptions, defaultKeepAlive time.Duration) (*LayerOptions, error) {
layerOptions := LayerOptions{ layerOptions := LayerOptions{
Capacity: 1000, Capacity: 1000,
Matchers: []string{"*"},
KeepAlive: defaultKeepAlive, KeepAlive: defaultKeepAlive,
MatchURLs: []string{"*"},
} }
config := mapstructure.DecoderConfig{ config := mapstructure.DecoderConfig{

View File

@ -1,6 +1,8 @@
package queue package queue
import "time" import (
"time"
)
type Options struct { type Options struct {
TemplateDir string TemplateDir string

View File

@ -7,11 +7,13 @@ import (
"math/rand" "math/rand"
"net/http" "net/http"
"path/filepath" "path/filepath"
"strconv"
"sync" "sync"
"sync/atomic" "sync/atomic"
"time" "time"
"forge.cadoles.com/Cadoles/go-proxy" "forge.cadoles.com/Cadoles/go-proxy"
"forge.cadoles.com/Cadoles/go-proxy/wildcard"
"forge.cadoles.com/cadoles/bouncer/internal/proxy/director" "forge.cadoles.com/cadoles/bouncer/internal/proxy/director"
"forge.cadoles.com/cadoles/bouncer/internal/store" "forge.cadoles.com/cadoles/bouncer/internal/store"
"github.com/Masterminds/sprig/v3" "github.com/Masterminds/sprig/v3"
@ -56,6 +58,13 @@ func (q *Queue) Middleware(layer *store.Layer) proxy.Middleware {
return return
} }
matches := wildcard.MatchAny(r.URL.String(), options.MatchURLs...)
if !matches {
h.ServeHTTP(w, r)
return
}
defer q.updateMetrics(ctx, layer.Proxy, layer.Name, options) defer q.updateMetrics(ctx, layer.Proxy, layer.Name, options)
cookieName := q.getCookieName(layer.Name) cookieName := q.getCookieName(layer.Name)
@ -181,6 +190,8 @@ func (q *Queue) renderQueuePage(w http.ResponseWriter, r *http.Request, queueNam
RefreshRate: refreshRate, RefreshRate: refreshRate,
} }
w.Header().Add("Cache-Control", "no-cache")
w.Header().Add("Retry-After", strconv.FormatInt(int64(refreshRate.Seconds()), 10))
w.WriteHeader(http.StatusServiceUnavailable) w.WriteHeader(http.StatusServiceUnavailable)
if err := q.tmpl.ExecuteTemplate(w, "queue", templateData); err != nil { if err := q.tmpl.ExecuteTemplate(w, "queue", templateData); err != nil {

View File

@ -9,6 +9,12 @@
}, },
"keepAlive": { "keepAlive": {
"type": "string" "type": "string"
},
"matchURLs": {
"type": "array",
"items": {
"type": "string"
}
} }
}, },
"additionalProperties": false "additionalProperties": false