@@ -133,31 +133,69 @@ deleteHeader k = updateHeaders $ H.delete k
133133-- <http://tools.ietf.org/html/rfc2068.html#section-5.1.1>).
134134data Method = GET | HEAD | POST | PUT | DELETE | TRACE | OPTIONS | CONNECT |
135135 PATCH | Method ByteString
136- deriving (Show ,Read ,Ord )
137-
136+ deriving (Show , Read )
138137
139138instance Eq Method where
140- GET == GET = True
141- GET == Method " GET" = True
142- HEAD == HEAD = True
143- HEAD == Method " HEAD" = True
144- POST == POST = True
145- POST == Method " POST" = True
146- PUT == PUT = True
147- PUT == Method " PUT" = True
148- DELETE == DELETE = True
149- DELETE == Method " DELETE" = True
150- TRACE == TRACE = True
151- TRACE == Method " TRACE" = True
152- OPTIONS == OPTIONS = True
153- OPTIONS == Method " OPTIONS" = True
154- CONNECT == CONNECT = True
155- CONNECT == Method " CONNECT" = True
156- PATCH == PATCH = True
157- PATCH == Method " PATCH" = True
158- Method a == Method b = a == b
159- m@ (Method _) == other = other == m
160- _ == _ = False
139+ a == b =
140+ normalizeMethod a `eq` normalizeMethod b
141+ where
142+ GET `eq` GET = True
143+ HEAD `eq` HEAD = True
144+ POST `eq` POST = True
145+ PUT `eq` PUT = True
146+ DELETE `eq` DELETE = True
147+ TRACE `eq` TRACE = True
148+ OPTIONS `eq` OPTIONS = True
149+ CONNECT `eq` CONNECT = True
150+ PATCH `eq` PATCH = True
151+ Method x1 `eq` Method y1 = x1 == y1
152+ _ `eq` _ = False
153+
154+ instance Ord Method where
155+ compare a b =
156+ check (normalizeMethod a) (normalizeMethod b)
157+ where
158+ check GET GET = EQ
159+ check HEAD HEAD = EQ
160+ check POST POST = EQ
161+ check PUT PUT = EQ
162+ check DELETE DELETE = EQ
163+ check TRACE TRACE = EQ
164+ check OPTIONS OPTIONS = EQ
165+ check CONNECT CONNECT = EQ
166+ check PATCH PATCH = EQ
167+ check (Method x1) (Method y1) = compare x1 y1
168+ check x y = compare (tag x) (tag y)
169+
170+ tag :: Method -> Int
171+ tag (GET {}) = 0
172+ tag (HEAD {}) = 1
173+ tag (POST {}) = 2
174+ tag (PUT {}) = 3
175+ tag (DELETE {}) = 4
176+ tag (TRACE {}) = 5
177+ tag (OPTIONS {}) = 6
178+ tag (CONNECT {}) = 7
179+ tag (PATCH {}) = 8
180+ tag (Method {}) = 9
181+
182+ -- | Equate the special case constructors with their corresponding
183+ -- @Method name@ variant.
184+ {-# INLINE normalizeMethod #-}
185+ normalizeMethod :: Method -> Method
186+ normalizeMethod m@ (Method name) = case name of
187+ " GET" -> GET
188+ " HEAD" -> HEAD
189+ " POST" -> POST
190+ " PUT" -> PUT
191+ " DELETE" -> DELETE
192+ " TRACE" -> TRACE
193+ " OPTIONS" -> OPTIONS
194+ " CONNECT" -> CONNECT
195+ " PATCH" -> PATCH
196+ _ -> m
197+ normalizeMethod m = m
198+
161199
162200------------------------------------------------------------------------------
163201type HttpVersion = (Int ,Int )
0 commit comments