1
0
mirror of https://github.com/MontFerret/ferret.git synced 2025-01-04 03:02:02 +02:00
ferret/pkg/html/driver.go

93 lines
1.7 KiB
Go
Raw Normal View History

package html
2018-09-18 22:42:38 +02:00
import (
"context"
2018-09-23 10:33:20 +02:00
"fmt"
"github.com/MontFerret/ferret/pkg/html/dynamic"
"github.com/MontFerret/ferret/pkg/html/static"
2018-09-23 10:33:20 +02:00
"github.com/MontFerret/ferret/pkg/runtime/core"
"github.com/MontFerret/ferret/pkg/runtime/env"
2018-09-18 22:42:38 +02:00
"github.com/MontFerret/ferret/pkg/runtime/values"
)
type (
DriverName string
dynamicCtxKey struct{}
staticCtxKey struct{}
)
2018-09-27 04:03:06 +02:00
const (
Dynamic DriverName = "dynamic"
Static DriverName = "static"
2018-09-27 04:03:06 +02:00
)
2018-09-18 22:42:38 +02:00
type Driver interface {
GetDocument(ctx context.Context, url values.String) (values.HTMLNode, error)
2018-09-18 22:42:38 +02:00
Close() error
}
func ToContext(ctx context.Context, name DriverName, drv Driver) context.Context {
var key interface{}
switch name {
case Dynamic:
key = dynamicCtxKey{}
case Static:
key = staticCtxKey{}
default:
return ctx
}
return context.WithValue(ctx, key, drv)
2018-09-18 22:42:38 +02:00
}
func FromContext(ctx context.Context, name DriverName) (Driver, error) {
var key interface{}
switch name {
case Dynamic:
key = dynamicCtxKey{}
case Static:
key = staticCtxKey{}
default:
return nil, core.Error(core.ErrInvalidArgument, fmt.Sprintf("%s driver", name))
}
val := ctx.Value(key)
2018-09-18 22:42:38 +02:00
drv, ok := val.(Driver)
if ok {
2018-09-23 10:33:20 +02:00
return drv, nil
2018-09-18 22:42:38 +02:00
}
2018-09-23 10:33:20 +02:00
return nil, core.Error(core.ErrNotFound, fmt.Sprintf("%s driver", name))
2018-09-18 22:42:38 +02:00
}
func WithDynamicDriver(ctx context.Context) context.Context {
e := env.FromContext(ctx)
return context.WithValue(
ctx,
dynamicCtxKey{},
dynamic.NewDriver(
e.CDPAddress,
dynamic.WithProxy(e.ProxyAddress),
dynamic.WithUserAgent(e.UserAgent),
),
)
2018-09-18 22:42:38 +02:00
}
func WithStaticDriver(ctx context.Context) context.Context {
e := env.FromContext(ctx)
return context.WithValue(
ctx,
staticCtxKey{},
static.NewDriver(
static.WithProxy(e.ProxyAddress),
static.WithUserAgent(e.UserAgent),
),
)
2018-09-18 22:42:38 +02:00
}