func testStoreCodeFrom(t *testing.T, i int, haveErr, wantErr error, haveScope scope.Option, wantScope scope.Scope, wantCode string, wantID int64) { if wantErr != nil { assert.EqualError(t, haveErr, wantErr.Error(), "Index: %d", i) } switch sos := haveScope.Scope(); sos { case scope.StoreID: assert.Exactly(t, wantID, haveScope.Store.StoreID(), "Index: %d", i) case scope.GroupID: assert.Exactly(t, wantID, haveScope.Group.GroupID(), "Index: %d", i) case scope.WebsiteID: assert.Exactly(t, wantID, haveScope.Website.WebsiteID(), "Index: %d", i) case scope.DefaultID: assert.Nil(t, haveScope.Store, "Index: %d", i) assert.Nil(t, haveScope.Group, "Index: %d", i) assert.Nil(t, haveScope.Website, "Index: %d", i) default: t.Fatalf("Unknown scope: %d", sos) } assert.Exactly(t, wantScope, haveScope.Scope(), "Index: %d", i) assert.Exactly(t, wantCode, haveScope.StoreCode(), "Index: %d", i) }
// WithInitStoreByFormCookie reads from a GET parameter or cookie the store code. // Checks if the store code is valid and allowed. If so it adjusts the context.Context // to provide the new requestedStore. // // It calls Reader.RequestedStore() to determine the correct store. // 1. check cookie store, always a string and the store code // 2. check for GET ___store variable, always a string and the store code func WithInitStoreByFormCookie() ctxhttp.Middleware { return func(hf ctxhttp.HandlerFunc) ctxhttp.HandlerFunc { return func(ctx context.Context, w http.ResponseWriter, r *http.Request) error { storeService, requestedStore, err := FromContextReader(ctx) if err != nil { if PkgLog.IsDebug() { PkgLog.Debug("store.WithInitStoreByToken.FromContextServiceReader", "err", err, "ctx", ctx) } return errgo.Mask(err) } var reqSO scope.Option reqSO, err = CodeFromRequestGET(r) if err != nil { if PkgLog.IsDebug() { PkgLog.Debug("store.WithInitStoreByFormCookie.StoreCodeFromRequestGET", "err", err, "req", r, "scope", reqSO) } reqSO, err = CodeFromCookie(r) if err != nil { // ignore further processing because all codes are invalid or not found if PkgLog.IsDebug() { PkgLog.Debug("store.WithInitStoreByFormCookie.StoreCodeFromCookie", "err", err, "req", r, "scope", reqSO) } return hf.ServeHTTPContext(ctx, w, r) } } var newRequestedStore *Store if newRequestedStore, err = storeService.RequestedStore(reqSO); err != nil { if PkgLog.IsDebug() { PkgLog.Debug("store.WithInitStoreByFormCookie.storeService.RequestedStore", "err", err, "req", r, "scope", reqSO) } return errgo.Mask(err) } soStoreCode := reqSO.StoreCode() // delete and re-set a new cookie, adjust context.Context if newRequestedStore != nil && newRequestedStore.Data.Code.String == soStoreCode { wds, err := newRequestedStore.Website.DefaultStore() if err != nil { if PkgLog.IsDebug() { PkgLog.Debug("store.WithInitStoreByFormCookie.Website.DefaultStore", "err", err, "soStoreCode", soStoreCode) } return errgo.Mask(err) } if wds.Data.Code.String == soStoreCode { newRequestedStore.DeleteCookie(w) // cookie not needed anymore } else { newRequestedStore.SetCookie(w) // make sure we force set the new store if newRequestedStore.StoreID() != requestedStore.StoreID() { // this may lead to a bug because the previously set storeService and requestedStore // will still exists and have not been removed. ctx = WithContextReader(ctx, storeService, newRequestedStore) } } } return hf(ctx, w, r) } } }