diff --git a/CHANGELOG.md b/CHANGELOG.md index c977793..d8cf0da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Changed -- Improved Keep-Alive settings for HTTP client used to perform requests to Mojang's APIs +- Improved Keep-Alive settings for HTTP client used to perform requests to Mojang's APIs. - Mojang's textures queue now has static delay of 1 second after each iteration to prevent strange `429` errors. - Mojang's textures queue now caches even errored responses for signed textures to avoid `429` errors. - Mojang's textures queue now caches textures data for 70 seconds to avoid strange `429` errors. @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Panic when Redis connection is broken. - Duplication of Redis connections pool for Mojang's textures queue. +- Removed validation rules for `hash` field. ## [4.2.0] - 2019-05-02 ### Added diff --git a/http/api.go b/http/api.go index 55b949b..9a41401 100644 --- a/http/api.go +++ b/http/api.go @@ -152,7 +152,7 @@ func validatePostSkinRequest(request *http.Request) map[string][]string { const maxMultipartMemory int64 = 32 << 20 const oneOfSkinOrUrlMessage = "One of url or skin should be provided, but not both" - request.ParseMultipartForm(maxMultipartMemory) + _ = request.ParseMultipartForm(maxMultipartMemory) validationRules := govalidator.MapData{ "identityId": {"required", "numeric", "min:1"}, @@ -161,7 +161,6 @@ func validatePostSkinRequest(request *http.Request) map[string][]string { "skinId": {"required", "numeric", "min:1"}, "url": {"url"}, "file:skin": {"ext:png", "size:24576", "mime:image/png"}, - "hash": {}, "is1_8": {"bool"}, "isSlim": {"bool"}, } @@ -174,7 +173,6 @@ func validatePostSkinRequest(request *http.Request) map[string][]string { } else if skinErr == nil { validationRules["file:skin"] = append(validationRules["file:skin"], "skinUploadingNotAvailable") } else if url != "" { - validationRules["hash"] = append(validationRules["hash"], "required") validationRules["is1_8"] = append(validationRules["is1_8"], "required") validationRules["isSlim"] = append(validationRules["isSlim"], "required") } @@ -213,7 +211,7 @@ func findIdentity(repo interfaces.SkinsRepository, identityId int, username stri record, err = repo.FindByUsername(username) if err == nil { - repo.RemoveByUsername(username) + _ = repo.RemoveByUsername(username) record.UserId = identityId } else { record = &model.Skin{ @@ -222,7 +220,7 @@ func findIdentity(repo interfaces.SkinsRepository, identityId int, username stri } } } else if record.Username != username { - repo.RemoveByUserId(identityId) + _ = repo.RemoveByUserId(identityId) record.Username = username } @@ -235,7 +233,7 @@ func apiBadRequest(resp http.ResponseWriter, errorsPerField map[string][]string) result, _ := json.Marshal(map[string]interface{}{ "errors": errorsPerField, }) - resp.Write(result) + _, _ = resp.Write(result) } func apiForbidden(resp http.ResponseWriter, reason string) { @@ -244,7 +242,7 @@ func apiForbidden(resp http.ResponseWriter, reason string) { result, _ := json.Marshal(map[string]interface{}{ "error": reason, }) - resp.Write(result) + _, _ = resp.Write(result) } func apiNotFound(resp http.ResponseWriter, reason string) { @@ -253,7 +251,7 @@ func apiNotFound(resp http.ResponseWriter, reason string) { result, _ := json.Marshal([]interface{}{ reason, }) - resp.Write(result) + _, _ = resp.Write(result) } func apiServerError(resp http.ResponseWriter) { diff --git a/http/api_test.go b/http/api_test.go index 24d9f67..01cd917 100644 --- a/http/api_test.go +++ b/http/api_test.go @@ -28,7 +28,7 @@ func TestConfig_PostSkin(t *testing.T) { resultModel := createSkinModel("mock_user", false) resultModel.SkinId = 5 - resultModel.Url = "http://ely.by/minecraft/skins/default.png" + resultModel.Url = "http://example.com/skin.png" resultModel.MojangTextures = "" resultModel.MojangSignature = "" @@ -37,13 +37,12 @@ func TestConfig_PostSkin(t *testing.T) { "username": {"mock_user"}, "uuid": {"0f657aa8-bfbe-415d-b700-5750090d3af3"}, "skinId": {"5"}, - "hash": {"94a457d92a61460cb9cb5d6f29732d2a"}, "is1_8": {"0"}, "isSlim": {"0"}, - "url": {"http://ely.by/minecraft/skins/default.png"}, + "url": {"http://example.com/skin.png"}, } - req := httptest.NewRequest("POST", "http://skinsystem.ely.by/api/skins", bytes.NewBufferString(form.Encode())) + req := httptest.NewRequest("POST", "http://chrly/api/skins", bytes.NewBufferString(form.Encode())) req.Header.Add("Content-Type", "application/x-www-form-urlencoded") w := httptest.NewRecorder() @@ -89,7 +88,7 @@ func TestConfig_PostSkin(t *testing.T) { panic(err) } - req := httptest.NewRequest("POST", "http://skinsystem.ely.by/api/skins", body) + req := httptest.NewRequest("POST", "http://chrly/api/skins", body) req.Header.Add("Content-Type", writer.FormDataContentType()) w := httptest.NewRecorder() @@ -141,7 +140,6 @@ func TestConfig_PostSkin(t *testing.T) { "username": {"mock_user"}, "uuid": {"0f657aa8-bfbe-415d-b700-5750090d3af3"}, "skinId": {"5"}, - "hash": {"94a457d92a61460cb9cb5d6f29732d2a"}, "is1_8": {"0"}, "isSlim": {"0"}, "url": {"http://textures-server.com/skin.png"}, @@ -171,7 +169,7 @@ func TestConfig_PostSkin(t *testing.T) { resultModel := createSkinModel("mock_user", false) resultModel.UserId = 2 resultModel.SkinId = 5 - resultModel.Url = "http://ely.by/minecraft/skins/default.png" + resultModel.Url = "http://example.com/skin.png" resultModel.MojangTextures = "" resultModel.MojangSignature = "" @@ -180,13 +178,12 @@ func TestConfig_PostSkin(t *testing.T) { "username": {"mock_user"}, "uuid": {"0f657aa8-bfbe-415d-b700-5750090d3af3"}, "skinId": {"5"}, - "hash": {"94a457d92a61460cb9cb5d6f29732d2a"}, "is1_8": {"0"}, "isSlim": {"0"}, - "url": {"http://ely.by/minecraft/skins/default.png"}, + "url": {"http://example.com/skin.png"}, } - req := httptest.NewRequest("POST", "http://skinsystem.ely.by/api/skins", bytes.NewBufferString(form.Encode())) + req := httptest.NewRequest("POST", "http://chrly/api/skins", bytes.NewBufferString(form.Encode())) req.Header.Add("Content-Type", "application/x-www-form-urlencoded") w := httptest.NewRecorder() @@ -219,7 +216,7 @@ func TestConfig_PostSkin(t *testing.T) { resultModel := createSkinModel("changed_username", false) resultModel.SkinId = 5 - resultModel.Url = "http://ely.by/minecraft/skins/default.png" + resultModel.Url = "http://example.com/skin.png" resultModel.MojangTextures = "" resultModel.MojangSignature = "" @@ -228,13 +225,12 @@ func TestConfig_PostSkin(t *testing.T) { "username": {"changed_username"}, "uuid": {"0f657aa8-bfbe-415d-b700-5750090d3af3"}, "skinId": {"5"}, - "hash": {"94a457d92a61460cb9cb5d6f29732d2a"}, "is1_8": {"0"}, "isSlim": {"0"}, - "url": {"http://ely.by/minecraft/skins/default.png"}, + "url": {"http://example.com/skin.png"}, } - req := httptest.NewRequest("POST", "http://skinsystem.ely.by/api/skins", bytes.NewBufferString(form.Encode())) + req := httptest.NewRequest("POST", "http://chrly/api/skins", bytes.NewBufferString(form.Encode())) req.Header.Add("Content-Type", "application/x-www-form-urlencoded") w := httptest.NewRecorder() @@ -268,7 +264,7 @@ func TestConfig_PostSkin(t *testing.T) { "mojangTextures": {"someBase64EncodedString"}, } - req := httptest.NewRequest("POST", "http://skinsystem.ely.by/api/skins", bytes.NewBufferString(form.Encode())) + req := httptest.NewRequest("POST", "http://chrly/api/skins", bytes.NewBufferString(form.Encode())) req.Header.Add("Content-Type", "application/x-www-form-urlencoded") w := httptest.NewRecorder() @@ -324,7 +320,7 @@ func TestConfig_PostSkin(t *testing.T) { config, mocks := setupMocks(ctrl) - req := httptest.NewRequest("POST", "http://skinsystem.ely.by/api/skins", nil) + req := httptest.NewRequest("POST", "http://chrly/api/skins", nil) req.Header.Add("Authorization", "Bearer invalid.jwt.token") w := httptest.NewRecorder() @@ -353,7 +349,7 @@ func TestConfig_DeleteSkinByUserId(t *testing.T) { config, mocks := setupMocks(ctrl) - req := httptest.NewRequest("DELETE", "http://skinsystem.ely.by/api/skins/id:1", nil) + req := httptest.NewRequest("DELETE", "http://chrly/api/skins/id:1", nil) w := httptest.NewRecorder() mocks.Auth.EXPECT().Check(gomock.Any()).Return(nil) @@ -381,7 +377,7 @@ func TestConfig_DeleteSkinByUserId(t *testing.T) { config, mocks := setupMocks(ctrl) - req := httptest.NewRequest("DELETE", "http://skinsystem.ely.by/api/skins/id:2", nil) + req := httptest.NewRequest("DELETE", "http://chrly/api/skins/id:2", nil) w := httptest.NewRecorder() mocks.Auth.EXPECT().Check(gomock.Any()).Return(nil) @@ -412,7 +408,7 @@ func TestConfig_DeleteSkinByUsername(t *testing.T) { config, mocks := setupMocks(ctrl) - req := httptest.NewRequest("DELETE", "http://skinsystem.ely.by/api/skins/mock_user", nil) + req := httptest.NewRequest("DELETE", "http://chrly/api/skins/mock_user", nil) w := httptest.NewRecorder() mocks.Auth.EXPECT().Check(gomock.Any()).Return(nil) @@ -440,7 +436,7 @@ func TestConfig_DeleteSkinByUsername(t *testing.T) { config, mocks := setupMocks(ctrl) - req := httptest.NewRequest("DELETE", "http://skinsystem.ely.by/api/skins/mock_user_2", nil) + req := httptest.NewRequest("DELETE", "http://chrly/api/skins/mock_user_2", nil) w := httptest.NewRecorder() mocks.Auth.EXPECT().Check(gomock.Any()).Return(nil)