Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for compatibility date and flags #1177

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .changelog/1177.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:enhancement
workers: Add support for compatibility_date and compatibility_flags when upoading a worker script
```
28 changes: 21 additions & 7 deletions workers.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,16 @@ type CreateWorkerParams struct {
// Bindings should be a map where the keys are the binding name, and the
// values are the binding content
Bindings map[string]WorkerBinding

// CompatibilityDate is a date in the form yyyy-mm-dd,
// which will be used to determine which version of the Workers runtime is used.
// https://developers.cloudflare.com/workers/platform/compatibility-dates/
CompatibilityDate string

// CompatibilityFlags are the names of features of the Workers runtime to be enabled or disabled,
// usually used together with CompatibilityDate.
// https://developers.cloudflare.com/workers/platform/compatibility-dates/#compatibility-flags
CompatibilityFlags []string
}

// WorkerScriptParams provides a worker script and the associated bindings.
Expand Down Expand Up @@ -224,7 +234,7 @@ func (api *API) UploadWorker(ctx context.Context, rc *ResourceContainer, params
err error
)

if params.Module || params.Logpush != nil || len(params.Bindings) > 0 {
if params.Module || params.Logpush != nil || len(params.Bindings) > 0 || params.CompatibilityDate != "" || len(params.CompatibilityFlags) > 0 {
contentType, body, err = formatMultipartBody(params)
if err != nil {
return WorkerScriptResponse{}, err
Expand Down Expand Up @@ -258,13 +268,17 @@ func formatMultipartBody(params CreateWorkerParams) (string, []byte, error) {
// Write metadata part
var scriptPartName string
meta := struct {
BodyPart string `json:"body_part,omitempty"`
MainModule string `json:"main_module,omitempty"`
Bindings []workerBindingMeta `json:"bindings"`
Logpush *bool `json:"logpush,omitempty"`
BodyPart string `json:"body_part,omitempty"`
MainModule string `json:"main_module,omitempty"`
Bindings []workerBindingMeta `json:"bindings"`
Logpush *bool `json:"logpush,omitempty"`
CompatibilityDate string `json:"compatibility_date,omitempty"`
CompatibilityFlags []string `json:"compatibility_flags,omitempty"`
}{
Bindings: make([]workerBindingMeta, 0, len(params.Bindings)),
Logpush: params.Logpush,
Bindings: make([]workerBindingMeta, 0, len(params.Bindings)),
Logpush: params.Logpush,
CompatibilityDate: params.CompatibilityDate,
CompatibilityFlags: params.CompatibilityFlags,
}

if params.Module {
Expand Down
57 changes: 47 additions & 10 deletions workers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -275,9 +275,11 @@ func getFileDetails(r *http.Request, key string) (*multipart.FileHeader, error)
}

type multipartUpload struct {
Script string
BindingMeta map[string]workerBindingMeta
Logpush *bool
Script string
BindingMeta map[string]workerBindingMeta
Logpush *bool
CompatibilityDate string
CompatibilityFlags []string
}

func parseMultipartUpload(r *http.Request) (multipartUpload, error) {
Expand All @@ -288,10 +290,12 @@ func parseMultipartUpload(r *http.Request) (multipartUpload, error) {
}

var metadata struct {
BodyPart string `json:"body_part,omitempty"`
MainModule string `json:"main_module,omitempty"`
Bindings []workerBindingMeta `json:"bindings"`
Logpush *bool `json:"logpush,omitempty"`
BodyPart string `json:"body_part,omitempty"`
MainModule string `json:"main_module,omitempty"`
Bindings []workerBindingMeta `json:"bindings"`
Logpush *bool `json:"logpush,omitempty"`
CompatibilityDate string `json:"compatibility_date,omitempty"`
CompatibilityFlags []string `json:"compatibility_flags,omitempty"`
}
err = json.Unmarshal(mdBytes, &metadata)
if err != nil {
Expand All @@ -318,9 +322,11 @@ func parseMultipartUpload(r *http.Request) (multipartUpload, error) {
}

return multipartUpload{
Script: string(script),
BindingMeta: bindingMeta,
Logpush: metadata.Logpush,
Script: string(script),
BindingMeta: bindingMeta,
Logpush: metadata.Logpush,
CompatibilityDate: metadata.CompatibilityDate,
CompatibilityFlags: metadata.CompatibilityFlags,
}, nil
}

Expand Down Expand Up @@ -859,3 +865,34 @@ func TestUploadWorker_WithLogpush(t *testing.T) {
assert.Equal(t, want, res)
}
}

func TestUploadWorker_WithCompatibilityFlags(t *testing.T) {
setup()
defer teardown()

compatibilityDate := time.Now().Format("2006-01-02")
compatibilityFlags := []string{"formdata_parser_supports_files"}

handler := func(w http.ResponseWriter, r *http.Request) {
assert.Equal(t, http.MethodPut, r.Method, "Expected method 'PUT', got %s", r.Method)

mpUpload, err := parseMultipartUpload(r)
assert.NoError(t, err)

assert.Equal(t, workerScript, mpUpload.Script)
assert.Equal(t, compatibilityDate, mpUpload.CompatibilityDate)
assert.Equal(t, compatibilityFlags, mpUpload.CompatibilityFlags)

w.Header().Set("content-type", "application/json")
fmt.Fprint(w, uploadWorkerResponseData)
}
mux.HandleFunc("/accounts/"+testAccountID+"/workers/scripts/bar", handler)

_, err := client.UploadWorker(context.Background(), AccountIdentifier(testAccountID), CreateWorkerParams{
ScriptName: "bar",
Script: workerScript,
CompatibilityDate: compatibilityDate,
CompatibilityFlags: compatibilityFlags,
})
assert.NoError(t, err)
}