0 | ||| HTTP URL 处理模块
 1 | ||| 提供 HTTP URL 相关的操作功能
 2 | module Network.URL.HTTP
 3 |
 4 | import public Network.URL.HTTP.Data
 5 |
 6 | import Data.List
 7 | import Data.Fin
 8 |
 9 | ||| 向 HTTP URL 中插入或更新查询参数
10 | ||| @p 要插入的查询参数(键值对)
11 | ||| @url 目标 URL
12 | ||| @returns 更新后的 URL
13 | public export
14 | insertParam : QueryParam -> HTTPURL -> HTTPURL
15 | insertParam p@(key, value) url = { query := newQuery } url
16 |   where
17 |     -- 获取当前的查询参数列表
18 |     params : List QueryParam
19 |     params = url.query
20 |
21 |     -- 查找是否已存在相同键的参数
22 |     hasIn : Maybe (Fin (Prelude.List.length $ url.query))
23 |     hasIn = findIndex (\(k,_) => k == key) params
24 |
25 |     -- 更新指定位置的参数
26 |     update : Fin (length (url .query)) -> List QueryParam -> List QueryParam
27 |     update idx ps = case inBounds (cast idx) ps of
28 |        (Yes _) => replaceAt (cast idx) p ps
29 |        _ => ps
30 |
31 |     -- 生成新的查询参数列表
32 |     -- 如果参数已存在则更新,否则添加到末尾
33 |     newQuery : List QueryParam 
34 |     newQuery = case hasIn of
35 |       Nothing => snoc params p
36 |       (Just idx) => update idx params
37 |