From fd27955e11966f96204efcf1f87ae9716bb3d078 Mon Sep 17 00:00:00 2001 From: David Stotijn Date: Thu, 31 Mar 2022 12:07:35 +0200 Subject: [PATCH] Sort HTTP headers --- .../intercept/components/EditRequest.tsx | 6 +++--- .../features/sender/components/EditRequest.tsx | 4 ++-- admin/src/lib/components/KeyValuePair.tsx | 16 ---------------- admin/src/lib/components/Response.tsx | 3 +-- pkg/api/models.go | 14 ++++++++++++++ pkg/api/resolvers.go | 11 +++++++++++ 6 files changed, 31 insertions(+), 23 deletions(-) diff --git a/admin/src/features/intercept/components/EditRequest.tsx b/admin/src/features/intercept/components/EditRequest.tsx index e9d0708..348d928 100644 --- a/admin/src/features/intercept/components/EditRequest.tsx +++ b/admin/src/features/intercept/components/EditRequest.tsx @@ -7,7 +7,7 @@ import { useRouter } from "next/router"; import React, { useEffect, useState } from "react"; import { useInterceptedRequests } from "lib/InterceptedRequestsContext"; -import { KeyValuePair, sortKeyValuePairs } from "lib/components/KeyValuePair"; +import { KeyValuePair } from "lib/components/KeyValuePair"; import Link from "lib/components/Link"; import RequestTabs from "lib/components/RequestTabs"; import ResponseStatus from "lib/components/ResponseStatus"; @@ -112,11 +112,11 @@ function EditRequest(): JSX.Element { newQueryParams.push({ key: "", value: "" }); setQueryParams(newQueryParams); - const newReqHeaders = sortKeyValuePairs(interceptedRequest.headers || []); + const newReqHeaders = interceptedRequest.headers || []; setReqHeaders([...newReqHeaders.map(({ key, value }) => ({ key, value })), { key: "", value: "" }]); setResBody(interceptedRequest.response?.body || ""); - const newResHeaders = sortKeyValuePairs(interceptedRequest.response?.headers || []); + const newResHeaders = interceptedRequest.response?.headers || []; setResHeaders([...newResHeaders.map(({ key, value }) => ({ key, value })), { key: "", value: "" }]); }, }); diff --git a/admin/src/features/sender/components/EditRequest.tsx b/admin/src/features/sender/components/EditRequest.tsx index f1b63bc..547236d 100644 --- a/admin/src/features/sender/components/EditRequest.tsx +++ b/admin/src/features/sender/components/EditRequest.tsx @@ -3,7 +3,7 @@ import { Alert, Box, Button, Fab, Tooltip, Typography, useTheme } from "@mui/mat import { useRouter } from "next/router"; import React, { useState } from "react"; -import { KeyValuePair, sortKeyValuePairs } from "lib/components/KeyValuePair"; +import { KeyValuePair } from "lib/components/KeyValuePair"; import RequestTabs from "lib/components/RequestTabs"; import Response from "lib/components/Response"; import SplitPane from "lib/components/SplitPane"; @@ -90,7 +90,7 @@ function EditRequest(): JSX.Element { newQueryParams.push({ key: "", value: "" }); setQueryParams(newQueryParams); - const newHeaders = sortKeyValuePairs(senderRequest.headers || []); + const newHeaders = senderRequest.headers || []; setHeaders([...newHeaders.map(({ key, value }) => ({ key, value })), { key: "", value: "" }]); setResponse(senderRequest.response); }, diff --git a/admin/src/lib/components/KeyValuePair.tsx b/admin/src/lib/components/KeyValuePair.tsx index 875c3cb..60024ba 100644 --- a/admin/src/lib/components/KeyValuePair.tsx +++ b/admin/src/lib/components/KeyValuePair.tsx @@ -184,20 +184,4 @@ export function KeyValuePairTable({ items, onChange, onDelete }: KeyValuePairTab ); } -export function sortKeyValuePairs(items: KeyValuePair[]): KeyValuePair[] { - const sorted = [...items]; - - sorted.sort((a, b) => { - if (a.key < b.key) { - return -1; - } - if (a.key > b.key) { - return 1; - } - return 0; - }); - - return sorted; -} - export default KeyValuePairTable; diff --git a/admin/src/lib/components/Response.tsx b/admin/src/lib/components/Response.tsx index 2f30f26..3df4a24 100644 --- a/admin/src/lib/components/Response.tsx +++ b/admin/src/lib/components/Response.tsx @@ -1,6 +1,5 @@ import { Box, Typography } from "@mui/material"; -import { sortKeyValuePairs } from "./KeyValuePair"; import ResponseTabs from "./ResponseTabs"; import ResponseStatus from "lib/components/ResponseStatus"; @@ -29,7 +28,7 @@ function Response({ response }: ResponseProps): JSX.Element { diff --git a/pkg/api/models.go b/pkg/api/models.go index c0109c9..4d79c4a 100644 --- a/pkg/api/models.go +++ b/pkg/api/models.go @@ -49,3 +49,17 @@ func UnmarshalURL(v interface{}) (*url.URL, error) { return u, nil } + +type HTTPHeaders []HTTPHeader + +func (h HTTPHeaders) Len() int { + return len(h) +} + +func (h HTTPHeaders) Less(i, j int) bool { + return h[i].Key < h[j].Key +} + +func (h HTTPHeaders) Swap(i, j int) { + h[i], h[j] = h[j], h[i] +} diff --git a/pkg/api/resolvers.go b/pkg/api/resolvers.go index e334b33..3802205 100644 --- a/pkg/api/resolvers.go +++ b/pkg/api/resolvers.go @@ -11,6 +11,7 @@ import ( "io/ioutil" "net/http" "regexp" + "sort" "strings" "github.com/99designs/gqlgen/graphql" @@ -124,6 +125,8 @@ func parseRequestLog(reqLog reqlog.RequestLog) (HTTPRequestLog, error) { }) } } + + sort.Sort(HTTPHeaders(log.Headers)) } if reqLog.Response != nil { @@ -172,6 +175,8 @@ func parseResponseLog(resLog reqlog.ResponseLog) (HTTPResponseLog, error) { }) } } + + sort.Sort(HTTPHeaders(httpResLog.Headers)) } return httpResLog, nil @@ -710,6 +715,8 @@ func parseSenderRequest(req sender.Request) (SenderRequest, error) { }) } } + + sort.Sort(HTTPHeaders(senderReq.Headers)) } if len(req.Body) > 0 { @@ -765,6 +772,8 @@ func parseHTTPRequest(req *http.Request) (HTTPRequest, error) { }) } } + + sort.Sort(HTTPHeaders(httpReq.Headers)) } if req.Body != nil { @@ -815,6 +824,8 @@ func parseHTTPResponse(res *http.Response) (HTTPResponse, error) { }) } } + + sort.Sort(HTTPHeaders(httpRes.Headers)) } if res.Body != nil {