config

package
v0.0.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 30, 2024 License: MIT Imports: 20 Imported by: 2

Documentation

Index

Constants

This section is empty.

Variables

View Source
var File_runtime_config_config_proto protoreflect.FileDescriptor
View Source
var File_runtime_config_registry_proto protoreflect.FileDescriptor

Functions

This section is empty.

Types

type Config

type Config = config.Config

func LoadConfig

func LoadConfig(path string) Config

func New

func New(opts ...Option) Config

type Decoder

type Decoder = config.Decoder

type Merge

type Merge = config.Merge

type Option

type Option = config.Option

func WithDecoder

func WithDecoder(decoder Decoder) Option

func WithMergeFunc

func WithMergeFunc(merge Merge) Option

func WithResolver

func WithResolver(resolver Resolver) Option

func WithSource

func WithSource(sources ...Source) Option

type RegistryConfig

type RegistryConfig struct {
	Type   string                 `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`           // Type
	Name   string                 `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`           // Name
	Consul *RegistryConfig_Consul `protobuf:"bytes,3,opt,name=consul,proto3,oneof" json:"consul,omitempty"` // Consul
	Etcd   *RegistryConfig_ETCD   `protobuf:"bytes,4,opt,name=etcd,proto3,oneof" json:"etcd,omitempty"`     // ETCD
	// contains filtered or unexported fields
}

Registration registry center

func (*RegistryConfig) Descriptor deprecated

func (*RegistryConfig) Descriptor() ([]byte, []int)

Deprecated: Use RegistryConfig.ProtoReflect.Descriptor instead.

func (*RegistryConfig) GetConsul

func (x *RegistryConfig) GetConsul() *RegistryConfig_Consul

func (*RegistryConfig) GetEtcd

func (x *RegistryConfig) GetEtcd() *RegistryConfig_ETCD

func (*RegistryConfig) GetName

func (x *RegistryConfig) GetName() string

func (*RegistryConfig) GetType

func (x *RegistryConfig) GetType() string

func (*RegistryConfig) ProtoMessage

func (*RegistryConfig) ProtoMessage()

func (*RegistryConfig) ProtoReflect

func (x *RegistryConfig) ProtoReflect() protoreflect.Message

func (*RegistryConfig) Reset

func (x *RegistryConfig) Reset()

func (*RegistryConfig) String

func (x *RegistryConfig) String() string

func (*RegistryConfig) Validate

func (m *RegistryConfig) Validate() error

Validate checks the field values on RegistryConfig with the rules defined in the proto definition for this message. If any rules are violated, the first error encountered is returned, or nil if there are no violations.

func (*RegistryConfig) ValidateAll

func (m *RegistryConfig) ValidateAll() error

ValidateAll checks the field values on RegistryConfig with the rules defined in the proto definition for this message. If any rules are violated, the result is a list of violation errors wrapped in RegistryConfigMultiError, or nil if none found.

type RegistryConfigMultiError

type RegistryConfigMultiError []error

RegistryConfigMultiError is an error wrapping multiple validation errors returned by RegistryConfig.ValidateAll() if the designated constraints aren't met.

func (RegistryConfigMultiError) AllErrors

func (m RegistryConfigMultiError) AllErrors() []error

AllErrors returns a list of validation violation errors.

func (RegistryConfigMultiError) Error

func (m RegistryConfigMultiError) Error() string

Error returns a concatenation of all the error messages it wraps.

type RegistryConfigValidationError

type RegistryConfigValidationError struct {
	// contains filtered or unexported fields
}

RegistryConfigValidationError is the validation error returned by RegistryConfig.Validate if the designated constraints aren't met.

func (RegistryConfigValidationError) Cause

Cause function returns cause value.

func (RegistryConfigValidationError) Error

Error satisfies the builtin error interface

func (RegistryConfigValidationError) ErrorName

func (e RegistryConfigValidationError) ErrorName() string

ErrorName returns error name.

func (RegistryConfigValidationError) Field

Field function returns field value.

func (RegistryConfigValidationError) Key

Key function returns key value.

func (RegistryConfigValidationError) Reason

Reason function returns reason value.

type RegistryConfig_Consul

type RegistryConfig_Consul struct {
	Address     string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
	Scheme      string `protobuf:"bytes,2,opt,name=scheme,proto3" json:"scheme,omitempty"`
	Token       string `protobuf:"bytes,3,opt,name=token,proto3" json:"token,omitempty"`
	HeartBeat   bool   `protobuf:"varint,4,opt,name=heart_beat,proto3" json:"heart_beat,omitempty"`
	HealthCheck bool   `protobuf:"varint,5,opt,name=health_check,proto3" json:"health_check,omitempty"`
	Datacenter  string `protobuf:"bytes,6,opt,name=datacenter,proto3" json:"datacenter,omitempty"`
	// string tag = 7 [json_name = "tag"];
	HealthCheckInterval uint32 `protobuf:"varint,8,opt,name=health_check_interval,proto3" json:"health_check_interval,omitempty"`
	// string health_check_timeout = 9[json_name = "health_check_timeout"];
	Timeout                        *durationpb.Duration `protobuf:"bytes,10,opt,name=timeout,proto3" json:"timeout,omitempty"`
	DeregisterCriticalServiceAfter uint32               `protobuf:"varint,11,opt,name=deregister_critical_service_after,proto3" json:"deregister_critical_service_after,omitempty"`
	// contains filtered or unexported fields
}

Consul

func (*RegistryConfig_Consul) Descriptor deprecated

func (*RegistryConfig_Consul) Descriptor() ([]byte, []int)

Deprecated: Use RegistryConfig_Consul.ProtoReflect.Descriptor instead.

func (*RegistryConfig_Consul) GetAddress

func (x *RegistryConfig_Consul) GetAddress() string

func (*RegistryConfig_Consul) GetDatacenter

func (x *RegistryConfig_Consul) GetDatacenter() string

func (*RegistryConfig_Consul) GetDeregisterCriticalServiceAfter

func (x *RegistryConfig_Consul) GetDeregisterCriticalServiceAfter() uint32

func (*RegistryConfig_Consul) GetHealthCheck

func (x *RegistryConfig_Consul) GetHealthCheck() bool

func (*RegistryConfig_Consul) GetHealthCheckInterval

func (x *RegistryConfig_Consul) GetHealthCheckInterval() uint32

func (*RegistryConfig_Consul) GetHeartBeat

func (x *RegistryConfig_Consul) GetHeartBeat() bool

func (*RegistryConfig_Consul) GetScheme

func (x *RegistryConfig_Consul) GetScheme() string

func (*RegistryConfig_Consul) GetTimeout

func (x *RegistryConfig_Consul) GetTimeout() *durationpb.Duration

func (*RegistryConfig_Consul) GetToken

func (x *RegistryConfig_Consul) GetToken() string

func (*RegistryConfig_Consul) ProtoMessage

func (*RegistryConfig_Consul) ProtoMessage()

func (*RegistryConfig_Consul) ProtoReflect

func (x *RegistryConfig_Consul) ProtoReflect() protoreflect.Message

func (*RegistryConfig_Consul) Reset

func (x *RegistryConfig_Consul) Reset()

func (*RegistryConfig_Consul) String

func (x *RegistryConfig_Consul) String() string

func (*RegistryConfig_Consul) Validate

func (m *RegistryConfig_Consul) Validate() error

Validate checks the field values on RegistryConfig_Consul with the rules defined in the proto definition for this message. If any rules are violated, the first error encountered is returned, or nil if there are no violations.

func (*RegistryConfig_Consul) ValidateAll

func (m *RegistryConfig_Consul) ValidateAll() error

ValidateAll checks the field values on RegistryConfig_Consul with the rules defined in the proto definition for this message. If any rules are violated, the result is a list of violation errors wrapped in RegistryConfig_ConsulMultiError, or nil if none found.

type RegistryConfig_ConsulMultiError

type RegistryConfig_ConsulMultiError []error

RegistryConfig_ConsulMultiError is an error wrapping multiple validation errors returned by RegistryConfig_Consul.ValidateAll() if the designated constraints aren't met.

func (RegistryConfig_ConsulMultiError) AllErrors

func (m RegistryConfig_ConsulMultiError) AllErrors() []error

AllErrors returns a list of validation violation errors.

func (RegistryConfig_ConsulMultiError) Error

Error returns a concatenation of all the error messages it wraps.

type RegistryConfig_ConsulValidationError

type RegistryConfig_ConsulValidationError struct {
	// contains filtered or unexported fields
}

RegistryConfig_ConsulValidationError is the validation error returned by RegistryConfig_Consul.Validate if the designated constraints aren't met.

func (RegistryConfig_ConsulValidationError) Cause

Cause function returns cause value.

func (RegistryConfig_ConsulValidationError) Error

Error satisfies the builtin error interface

func (RegistryConfig_ConsulValidationError) ErrorName

ErrorName returns error name.

func (RegistryConfig_ConsulValidationError) Field

Field function returns field value.

func (RegistryConfig_ConsulValidationError) Key

Key function returns key value.

func (RegistryConfig_ConsulValidationError) Reason

Reason function returns reason value.

type RegistryConfig_ETCD

type RegistryConfig_ETCD struct {
	Endpoints []string `protobuf:"bytes,1,rep,name=endpoints,proto3" json:"endpoints,omitempty"`
	// contains filtered or unexported fields
}

func (*RegistryConfig_ETCD) Descriptor deprecated

func (*RegistryConfig_ETCD) Descriptor() ([]byte, []int)

Deprecated: Use RegistryConfig_ETCD.ProtoReflect.Descriptor instead.

func (*RegistryConfig_ETCD) GetEndpoints

func (x *RegistryConfig_ETCD) GetEndpoints() []string

func (*RegistryConfig_ETCD) ProtoMessage

func (*RegistryConfig_ETCD) ProtoMessage()

func (*RegistryConfig_ETCD) ProtoReflect

func (x *RegistryConfig_ETCD) ProtoReflect() protoreflect.Message

func (*RegistryConfig_ETCD) Reset

func (x *RegistryConfig_ETCD) Reset()

func (*RegistryConfig_ETCD) String

func (x *RegistryConfig_ETCD) String() string

func (*RegistryConfig_ETCD) Validate

func (m *RegistryConfig_ETCD) Validate() error

Validate checks the field values on RegistryConfig_ETCD with the rules defined in the proto definition for this message. If any rules are violated, the first error encountered is returned, or nil if there are no violations.

func (*RegistryConfig_ETCD) ValidateAll

func (m *RegistryConfig_ETCD) ValidateAll() error

ValidateAll checks the field values on RegistryConfig_ETCD with the rules defined in the proto definition for this message. If any rules are violated, the result is a list of violation errors wrapped in RegistryConfig_ETCDMultiError, or nil if none found.

type RegistryConfig_ETCDMultiError

type RegistryConfig_ETCDMultiError []error

RegistryConfig_ETCDMultiError is an error wrapping multiple validation errors returned by RegistryConfig_ETCD.ValidateAll() if the designated constraints aren't met.

func (RegistryConfig_ETCDMultiError) AllErrors

func (m RegistryConfig_ETCDMultiError) AllErrors() []error

AllErrors returns a list of validation violation errors.

func (RegistryConfig_ETCDMultiError) Error

Error returns a concatenation of all the error messages it wraps.

type RegistryConfig_ETCDValidationError

type RegistryConfig_ETCDValidationError struct {
	// contains filtered or unexported fields
}

RegistryConfig_ETCDValidationError is the validation error returned by RegistryConfig_ETCD.Validate if the designated constraints aren't met.

func (RegistryConfig_ETCDValidationError) Cause

Cause function returns cause value.

func (RegistryConfig_ETCDValidationError) Error

Error satisfies the builtin error interface

func (RegistryConfig_ETCDValidationError) ErrorName

ErrorName returns error name.

func (RegistryConfig_ETCDValidationError) Field

Field function returns field value.

func (RegistryConfig_ETCDValidationError) Key

Key function returns key value.

func (RegistryConfig_ETCDValidationError) Reason

Reason function returns reason value.

type Resolver

type Resolver = config.Resolver

type Source

type Source = config.Source

type SourceConfig

type SourceConfig struct {
	Type   string               `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Type
	Name   string               `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Name
	File   *SourceConfig_File   `protobuf:"bytes,3,opt,name=file,proto3,oneof" json:"file,omitempty"`
	Consul *SourceConfig_Consul `protobuf:"bytes,4,opt,name=consul,proto3,oneof" json:"consul,omitempty"` // Consul
	Etcd   *SourceConfig_ETCD   `protobuf:"bytes,5,opt,name=etcd,proto3,oneof" json:"etcd,omitempty"`     // ETCD
	// contains filtered or unexported fields
}

Registration source center

func DefaultConsulConfig

func DefaultConsulConfig() *SourceConfig

func DefaultFileConfig

func DefaultFileConfig() *SourceConfig

func (*SourceConfig) Descriptor deprecated

func (*SourceConfig) Descriptor() ([]byte, []int)

Deprecated: Use SourceConfig.ProtoReflect.Descriptor instead.

func (*SourceConfig) GetConsul

func (x *SourceConfig) GetConsul() *SourceConfig_Consul

func (*SourceConfig) GetEtcd

func (x *SourceConfig) GetEtcd() *SourceConfig_ETCD

func (*SourceConfig) GetFile

func (x *SourceConfig) GetFile() *SourceConfig_File

func (*SourceConfig) GetName

func (x *SourceConfig) GetName() string

func (*SourceConfig) GetType

func (x *SourceConfig) GetType() string

func (*SourceConfig) ProtoMessage

func (*SourceConfig) ProtoMessage()

func (*SourceConfig) ProtoReflect

func (x *SourceConfig) ProtoReflect() protoreflect.Message

func (*SourceConfig) Reset

func (x *SourceConfig) Reset()

func (*SourceConfig) String

func (x *SourceConfig) String() string

func (*SourceConfig) Validate

func (m *SourceConfig) Validate() error

Validate checks the field values on SourceConfig with the rules defined in the proto definition for this message. If any rules are violated, the first error encountered is returned, or nil if there are no violations.

func (*SourceConfig) ValidateAll

func (m *SourceConfig) ValidateAll() error

ValidateAll checks the field values on SourceConfig with the rules defined in the proto definition for this message. If any rules are violated, the result is a list of violation errors wrapped in SourceConfigMultiError, or nil if none found.

type SourceConfigMultiError

type SourceConfigMultiError []error

SourceConfigMultiError is an error wrapping multiple validation errors returned by SourceConfig.ValidateAll() if the designated constraints aren't met.

func (SourceConfigMultiError) AllErrors

func (m SourceConfigMultiError) AllErrors() []error

AllErrors returns a list of validation violation errors.

func (SourceConfigMultiError) Error

func (m SourceConfigMultiError) Error() string

Error returns a concatenation of all the error messages it wraps.

type SourceConfigValidationError

type SourceConfigValidationError struct {
	// contains filtered or unexported fields
}

SourceConfigValidationError is the validation error returned by SourceConfig.Validate if the designated constraints aren't met.

func (SourceConfigValidationError) Cause

Cause function returns cause value.

func (SourceConfigValidationError) Error

Error satisfies the builtin error interface

func (SourceConfigValidationError) ErrorName

func (e SourceConfigValidationError) ErrorName() string

ErrorName returns error name.

func (SourceConfigValidationError) Field

Field function returns field value.

func (SourceConfigValidationError) Key

Key function returns key value.

func (SourceConfigValidationError) Reason

Reason function returns reason value.

type SourceConfig_Consul

type SourceConfig_Consul struct {
	Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
	Scheme  string `protobuf:"bytes,2,opt,name=scheme,proto3" json:"scheme,omitempty"`
	Token   string `protobuf:"bytes,3,opt,name=token,proto3" json:"token,omitempty"`
	Path    string `protobuf:"bytes,4,opt,name=path,proto3" json:"path,omitempty"`
	// contains filtered or unexported fields
}

Consul

func (*SourceConfig_Consul) Descriptor deprecated

func (*SourceConfig_Consul) Descriptor() ([]byte, []int)

Deprecated: Use SourceConfig_Consul.ProtoReflect.Descriptor instead.

func (*SourceConfig_Consul) GetAddress

func (x *SourceConfig_Consul) GetAddress() string

func (*SourceConfig_Consul) GetPath

func (x *SourceConfig_Consul) GetPath() string

func (*SourceConfig_Consul) GetScheme

func (x *SourceConfig_Consul) GetScheme() string

func (*SourceConfig_Consul) GetToken

func (x *SourceConfig_Consul) GetToken() string

func (*SourceConfig_Consul) ProtoMessage

func (*SourceConfig_Consul) ProtoMessage()

func (*SourceConfig_Consul) ProtoReflect

func (x *SourceConfig_Consul) ProtoReflect() protoreflect.Message

func (*SourceConfig_Consul) Reset

func (x *SourceConfig_Consul) Reset()

func (*SourceConfig_Consul) String

func (x *SourceConfig_Consul) String() string

func (*SourceConfig_Consul) Validate

func (m *SourceConfig_Consul) Validate() error

Validate checks the field values on SourceConfig_Consul with the rules defined in the proto definition for this message. If any rules are violated, the first error encountered is returned, or nil if there are no violations.

func (*SourceConfig_Consul) ValidateAll

func (m *SourceConfig_Consul) ValidateAll() error

ValidateAll checks the field values on SourceConfig_Consul with the rules defined in the proto definition for this message. If any rules are violated, the result is a list of violation errors wrapped in SourceConfig_ConsulMultiError, or nil if none found.

type SourceConfig_ConsulMultiError

type SourceConfig_ConsulMultiError []error

SourceConfig_ConsulMultiError is an error wrapping multiple validation errors returned by SourceConfig_Consul.ValidateAll() if the designated constraints aren't met.

func (SourceConfig_ConsulMultiError) AllErrors

func (m SourceConfig_ConsulMultiError) AllErrors() []error

AllErrors returns a list of validation violation errors.

func (SourceConfig_ConsulMultiError) Error

Error returns a concatenation of all the error messages it wraps.

type SourceConfig_ConsulValidationError

type SourceConfig_ConsulValidationError struct {
	// contains filtered or unexported fields
}

SourceConfig_ConsulValidationError is the validation error returned by SourceConfig_Consul.Validate if the designated constraints aren't met.

func (SourceConfig_ConsulValidationError) Cause

Cause function returns cause value.

func (SourceConfig_ConsulValidationError) Error

Error satisfies the builtin error interface

func (SourceConfig_ConsulValidationError) ErrorName

ErrorName returns error name.

func (SourceConfig_ConsulValidationError) Field

Field function returns field value.

func (SourceConfig_ConsulValidationError) Key

Key function returns key value.

func (SourceConfig_ConsulValidationError) Reason

Reason function returns reason value.

type SourceConfig_ETCD

type SourceConfig_ETCD struct {
	Endpoints []string `protobuf:"bytes,1,rep,name=endpoints,proto3" json:"endpoints,omitempty"`
	// contains filtered or unexported fields
}

func (*SourceConfig_ETCD) Descriptor deprecated

func (*SourceConfig_ETCD) Descriptor() ([]byte, []int)

Deprecated: Use SourceConfig_ETCD.ProtoReflect.Descriptor instead.

func (*SourceConfig_ETCD) GetEndpoints

func (x *SourceConfig_ETCD) GetEndpoints() []string

func (*SourceConfig_ETCD) ProtoMessage

func (*SourceConfig_ETCD) ProtoMessage()

func (*SourceConfig_ETCD) ProtoReflect

func (x *SourceConfig_ETCD) ProtoReflect() protoreflect.Message

func (*SourceConfig_ETCD) Reset

func (x *SourceConfig_ETCD) Reset()

func (*SourceConfig_ETCD) String

func (x *SourceConfig_ETCD) String() string

func (*SourceConfig_ETCD) Validate

func (m *SourceConfig_ETCD) Validate() error

Validate checks the field values on SourceConfig_ETCD with the rules defined in the proto definition for this message. If any rules are violated, the first error encountered is returned, or nil if there are no violations.

func (*SourceConfig_ETCD) ValidateAll

func (m *SourceConfig_ETCD) ValidateAll() error

ValidateAll checks the field values on SourceConfig_ETCD with the rules defined in the proto definition for this message. If any rules are violated, the result is a list of violation errors wrapped in SourceConfig_ETCDMultiError, or nil if none found.

type SourceConfig_ETCDMultiError

type SourceConfig_ETCDMultiError []error

SourceConfig_ETCDMultiError is an error wrapping multiple validation errors returned by SourceConfig_ETCD.ValidateAll() if the designated constraints aren't met.

func (SourceConfig_ETCDMultiError) AllErrors

func (m SourceConfig_ETCDMultiError) AllErrors() []error

AllErrors returns a list of validation violation errors.

func (SourceConfig_ETCDMultiError) Error

Error returns a concatenation of all the error messages it wraps.

type SourceConfig_ETCDValidationError

type SourceConfig_ETCDValidationError struct {
	// contains filtered or unexported fields
}

SourceConfig_ETCDValidationError is the validation error returned by SourceConfig_ETCD.Validate if the designated constraints aren't met.

func (SourceConfig_ETCDValidationError) Cause

Cause function returns cause value.

func (SourceConfig_ETCDValidationError) Error

Error satisfies the builtin error interface

func (SourceConfig_ETCDValidationError) ErrorName

ErrorName returns error name.

func (SourceConfig_ETCDValidationError) Field

Field function returns field value.

func (SourceConfig_ETCDValidationError) Key

Key function returns key value.

func (SourceConfig_ETCDValidationError) Reason

Reason function returns reason value.

type SourceConfig_File

type SourceConfig_File struct {
	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	// contains filtered or unexported fields
}

func (*SourceConfig_File) Descriptor deprecated

func (*SourceConfig_File) Descriptor() ([]byte, []int)

Deprecated: Use SourceConfig_File.ProtoReflect.Descriptor instead.

func (*SourceConfig_File) GetPath

func (x *SourceConfig_File) GetPath() string

func (*SourceConfig_File) ProtoMessage

func (*SourceConfig_File) ProtoMessage()

func (*SourceConfig_File) ProtoReflect

func (x *SourceConfig_File) ProtoReflect() protoreflect.Message

func (*SourceConfig_File) Reset

func (x *SourceConfig_File) Reset()

func (*SourceConfig_File) String

func (x *SourceConfig_File) String() string

func (*SourceConfig_File) Validate

func (m *SourceConfig_File) Validate() error

Validate checks the field values on SourceConfig_File with the rules defined in the proto definition for this message. If any rules are violated, the first error encountered is returned, or nil if there are no violations.

func (*SourceConfig_File) ValidateAll

func (m *SourceConfig_File) ValidateAll() error

ValidateAll checks the field values on SourceConfig_File with the rules defined in the proto definition for this message. If any rules are violated, the result is a list of violation errors wrapped in SourceConfig_FileMultiError, or nil if none found.

type SourceConfig_FileMultiError

type SourceConfig_FileMultiError []error

SourceConfig_FileMultiError is an error wrapping multiple validation errors returned by SourceConfig_File.ValidateAll() if the designated constraints aren't met.

func (SourceConfig_FileMultiError) AllErrors

func (m SourceConfig_FileMultiError) AllErrors() []error

AllErrors returns a list of validation violation errors.

func (SourceConfig_FileMultiError) Error

Error returns a concatenation of all the error messages it wraps.

type SourceConfig_FileValidationError

type SourceConfig_FileValidationError struct {
	// contains filtered or unexported fields
}

SourceConfig_FileValidationError is the validation error returned by SourceConfig_File.Validate if the designated constraints aren't met.

func (SourceConfig_FileValidationError) Cause

Cause function returns cause value.

func (SourceConfig_FileValidationError) Error

Error satisfies the builtin error interface

func (SourceConfig_FileValidationError) ErrorName

ErrorName returns error name.

func (SourceConfig_FileValidationError) Field

Field function returns field value.

func (SourceConfig_FileValidationError) Key

Key function returns key value.

func (SourceConfig_FileValidationError) Reason

Reason function returns reason value.

type Type

type Type string
const (
	File   Type = "file"
	Consul Type = "consul"
	ETCD   Type = "etcd"
)

func (Type) String

func (t Type) String() string

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL