mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 06:12:25 -05:00 
			
		
		
		
	[bugfix] Fix NegotiateAccept with multi accept
There's a bug in Gin's NegotiateFormat that doesn't handle the presence of multilpe accept headers. This lifts the code from the PR @tsmethurst sent a year ago to Gin into our codebase to fix the issue.
This commit is contained in:
		
					parent
					
						
							
								2478d83c84
							
						
					
				
			
			
				commit
				
					
						7050112af1
					
				
			
		
					 4 changed files with 122 additions and 3 deletions
				
			
		
							
								
								
									
										65
									
								
								internal/api/util/negotiate_test.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								internal/api/util/negotiate_test.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,65 @@ | |||
| package util | ||||
| 
 | ||||
| import ( | ||||
| 	"net/http" | ||||
| 	"net/http/httptest" | ||||
| 	"strings" | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/gin-gonic/gin" | ||||
| ) | ||||
| 
 | ||||
| type testMIMES []MIME | ||||
| 
 | ||||
| func (tm testMIMES) String(t *testing.T) string { | ||||
| 	t.Helper() | ||||
| 
 | ||||
| 	res := tm.StringS(t) | ||||
| 	return strings.Join(res, ",") | ||||
| } | ||||
| 
 | ||||
| func (tm testMIMES) StringS(t *testing.T) []string { | ||||
| 	t.Helper() | ||||
| 
 | ||||
| 	res := make([]string, 0, len(tm)) | ||||
| 	for _, m := range tm { | ||||
| 		res = append(res, string(m)) | ||||
| 	} | ||||
| 	return res | ||||
| } | ||||
| 
 | ||||
| func TestNegotiateFormat(t *testing.T) { | ||||
| 	tests := []struct { | ||||
| 		incoming []string | ||||
| 		offered  testMIMES | ||||
| 		format   string | ||||
| 	}{ | ||||
| 		{incoming: testMIMES{AppJSON}.StringS(t), offered: testMIMES{AppJRDJSON, AppJSON}, format: "application/json"}, | ||||
| 		{incoming: testMIMES{AppJRDJSON}.StringS(t), offered: testMIMES{AppJRDJSON, AppJSON}, format: "application/jrd+json"}, | ||||
| 		{incoming: testMIMES{AppJRDJSON, AppJSON}.StringS(t), offered: testMIMES{AppJRDJSON}, format: "application/jrd+json"}, | ||||
| 		{incoming: testMIMES{AppJRDJSON, AppJSON}.StringS(t), offered: testMIMES{AppJSON}, format: "application/json"}, | ||||
| 		{incoming: testMIMES{"text/html,application/xhtml+xml,application/xml;q=0.9;q=0.8"}.StringS(t), offered: testMIMES{AppJSON, AppXML}, format: "application/xml"}, | ||||
| 		{incoming: testMIMES{"text/html,application/xhtml+xml,application/xml;q=0.9;q=0.8"}.StringS(t), offered: testMIMES{TextHTML, AppXML}, format: "text/html"}, | ||||
| 	} | ||||
| 
 | ||||
| 	for _, tt := range tests { | ||||
| 		name := "incoming:" + strings.Join(tt.incoming, ",") + " offered:" + tt.offered.String(t) | ||||
| 		t.Run(name, func(t *testing.T) { | ||||
| 			tt := tt | ||||
| 			t.Parallel() | ||||
| 
 | ||||
| 			c, _ := gin.CreateTestContext(httptest.NewRecorder()) | ||||
| 			c.Request = &http.Request{ | ||||
| 				Header: make(http.Header), | ||||
| 			} | ||||
| 			for _, header := range tt.incoming { | ||||
| 				c.Request.Header.Add("accept", header) | ||||
| 			} | ||||
| 
 | ||||
| 			format := NegotiateFormat(c, tt.offered.StringS(t)...) | ||||
| 			if tt.format != format { | ||||
| 				t.Fatalf("expected format: '%s', got format: '%s'", tt.format, format) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue