This is an automated email from the ASF dual-hosted git repository.

ocket8888 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git


The following commit(s) were added to refs/heads/master by this push:
     new e82501c92f Added catch for missing POST body when posted to 
profileparameters (#7194)
e82501c92f is described below

commit e82501c92f150aa8bc7b8a7dcd80c26adc30a66e
Author: Kurtis Michie <[email protected]>
AuthorDate: Tue Nov 22 15:53:40 2022 -0700

    Added catch for missing POST body when posted to profileparameters (#7194)
    
    * Added catch for missing POST body when posted to profileparameters
    
    * Added test for missing POST body to profileparameters into v3 and v5, and 
added change into changelog.md
    
    * Delete traffic-ops-test.conf
    
    * Accidentally deleted.  Meant to revert.  Adding back in.
    
    * Update traffic-ops-test.conf
    
    Added new line to end of file
    
    * Created one off test to check POST for an empty JSON body
    
    * Corrected correct URL Path for versions 3.0 and 4.0
---
 CHANGELOG.md                                          |  1 +
 traffic_ops/testing/api/v3/profile_parameters_test.go | 12 ++++++++++++
 traffic_ops/testing/api/v4/profile_parameters_test.go | 12 ++++++++++++
 traffic_ops/testing/api/v5/profile_parameters_test.go | 12 ++++++++++++
 traffic_ops/traffic_ops_golang/api/shared_handlers.go |  5 +++++
 5 files changed, 42 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 910320a44c..50e949a7a3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -31,6 +31,7 @@ The format is based on [Keep a 
Changelog](http://keepachangelog.com/en/1.0.0/).
 - Switched Delivery Service active state to a three-value system, adding a 
state that will be used to prevent cache servers from deploying DS 
configuration.
 
 ### Fixed
+- [#4428](https://github.com/apache/trafficcontrol/issues/4428) *Traffic Ops* 
Fixed Internal Server Error with POST to `profileparameters` when POST body is 
empty
 - [#7179](https://github.com/apache/trafficcontrol/issues/7179) *Traffic 
Portal* Fixed search filter for Delivery Service Table
 - [#7174](https://github.com/apache/trafficcontrol/issues/7174) *Traffic 
Portal* Fixed topologies sort (table and Delivery Service's form)
 - [#5970](https://github.com/apache/trafficcontrol/issues/5970) *Traffic 
Portal* Fixed numeric sort in Delivery Service's form for DSCP
diff --git a/traffic_ops/testing/api/v3/profile_parameters_test.go 
b/traffic_ops/testing/api/v3/profile_parameters_test.go
index b2931a7cec..fe73aa262b 100644
--- a/traffic_ops/testing/api/v3/profile_parameters_test.go
+++ b/traffic_ops/testing/api/v3/profile_parameters_test.go
@@ -34,6 +34,8 @@ const queryParamFormat = "?profileId=%s&parameterId=%s"
 func TestProfileParameters(t *testing.T) {
        WithObjs(t, []TCObj{CDNs, Types, Parameters, Profiles, 
ProfileParameters}, func() {
 
+               // This is a one off test to check POST with an empty JSON body
+               TestPostWithEmptyBody(t)
                currentTime := time.Now().UTC().Add(-15 * time.Second)
                tomorrow := currentTime.AddDate(0, 0, 1).Format(time.RFC1123)
 
@@ -163,6 +165,16 @@ func TestProfileParameters(t *testing.T) {
        })
 }
 
+func TestPostWithEmptyBody(t *testing.T) {
+       resp, err := 
TOSession.Client.Post(TOSession.URL+"/api/3.0/profileparameters", 
"application/json", nil)
+       if err != nil {
+               t.Fatalf("error sending post to create profile parameter with 
an empty body: %v", err)
+       }
+       if resp.StatusCode != http.StatusBadRequest {
+               t.Errorf("expected to get a 400 error code, but received %d 
instead", resp.StatusCode)
+       }
+}
+
 func CreateTestProfileParameters(t *testing.T) {
        for _, profile := range testData.Profiles {
                profileID := GetProfileID(t, profile.Name)()
diff --git a/traffic_ops/testing/api/v4/profile_parameters_test.go 
b/traffic_ops/testing/api/v4/profile_parameters_test.go
index efa620533e..23365c12f0 100644
--- a/traffic_ops/testing/api/v4/profile_parameters_test.go
+++ b/traffic_ops/testing/api/v4/profile_parameters_test.go
@@ -33,6 +33,8 @@ import (
 func TestProfileParameters(t *testing.T) {
        WithObjs(t, []TCObj{CDNs, Types, Parameters, Profiles, 
ProfileParameters}, func() {
 
+               // This is a one off test to check POST with an empty JSON body
+               TestPostWithEmptyBody(t)
                currentTime := time.Now().UTC().Add(-15 * time.Second)
                tomorrow := currentTime.AddDate(0, 0, 1).Format(time.RFC1123)
 
@@ -172,6 +174,16 @@ func TestProfileParameters(t *testing.T) {
        })
 }
 
+func TestPostWithEmptyBody(t *testing.T) {
+       resp, err := 
TOSession.Client.Post(TOSession.URL+"/api/4.0/profileparameters", 
"application/json", nil)
+       if err != nil {
+               t.Fatalf("error sending post to create profile parameter with 
an empty body: %v", err)
+       }
+       if resp.StatusCode != http.StatusBadRequest {
+               t.Errorf("expected to get a 400 error code, but received %d 
instead", resp.StatusCode)
+       }
+}
+
 func TestProfileParameter(t *testing.T) {
        WithObjs(t, []TCObj{CDNs, Types, Parameters, Profiles}, func() {
 
diff --git a/traffic_ops/testing/api/v5/profile_parameters_test.go 
b/traffic_ops/testing/api/v5/profile_parameters_test.go
index e44ebd7831..e2b264a231 100644
--- a/traffic_ops/testing/api/v5/profile_parameters_test.go
+++ b/traffic_ops/testing/api/v5/profile_parameters_test.go
@@ -33,6 +33,8 @@ import (
 func TestProfileParameters(t *testing.T) {
        WithObjs(t, []TCObj{CDNs, Types, Parameters, Profiles, 
ProfileParameters}, func() {
 
+               // This is a one off test to check POST with an empty JSON body
+               TestPostWithEmptyBody(t)
                currentTime := time.Now().UTC().Add(-15 * time.Second)
                tomorrow := currentTime.AddDate(0, 0, 1).Format(time.RFC1123)
 
@@ -172,6 +174,16 @@ func TestProfileParameters(t *testing.T) {
        })
 }
 
+func TestPostWithEmptyBody(t *testing.T) {
+       resp, err := 
TOSession.Client.Post(TOSession.URL+"/api/5.0/profileparameters", 
"application/json", nil)
+       if err != nil {
+               t.Fatalf("error sending post to create profile parameter with 
an empty body: %v", err)
+       }
+       if resp.StatusCode != http.StatusBadRequest {
+               t.Errorf("expected to get a 400 error code, but received %d 
instead", resp.StatusCode)
+       }
+}
+
 func TestProfileParameter(t *testing.T) {
        WithObjs(t, []TCObj{CDNs, Types, Parameters, Profiles}, func() {
 
diff --git a/traffic_ops/traffic_ops_golang/api/shared_handlers.go 
b/traffic_ops/traffic_ops_golang/api/shared_handlers.go
index 3fe6e786d7..2f7e139801 100644
--- a/traffic_ops/traffic_ops_golang/api/shared_handlers.go
+++ b/traffic_ops/traffic_ops_golang/api/shared_handlers.go
@@ -495,6 +495,11 @@ func CreateHandler(creator Creator) http.HandlerFunc {
                                return
                        }
 
+                       if len(data) == 0 {
+                               HandleErr(w, r, inf.Tx.Tx, 
http.StatusBadRequest, errors.New("no request body supplied"), nil)
+                               return
+                       }
+
                        objSlice, err := parseMultipleCreates(data, objectType, 
inf)
                        if err != nil {
                                HandleErr(w, r, inf.Tx.Tx, 
http.StatusInternalServerError, nil, err)

Reply via email to