create http universe package

Signed-off-by: jffarge <slumbering.pierrot@gmail.com>
This commit is contained in:
jffarge
2021-10-19 15:06:14 +02:00
committed by guillaume
parent fa334f4a86
commit b94b8c0c70
7 changed files with 227 additions and 0 deletions

81
stdlib/http/http.cue Normal file
View File

@@ -0,0 +1,81 @@
package http
import (
"encoding/json"
"strconv"
"alpha.dagger.io/alpine"
"alpha.dagger.io/dagger"
"alpha.dagger.io/os"
)
#Get: #Do & {method: "GET"}
#Post: #Do & {method: "POST"}
#Put: #Do & {method: "PUT"}
#Delete: #Do & {method: "DELETE"}
#Do: {
url: string
method: "GET" | "POST" | "PUT" | "DELETE" | "PATH" | "HEAD"
request: {
body: string | *""
header: [string]: string | [...string]
token: dagger.#Secret | *null
}
ctr: os.#Container & {
image: alpine.#Image & {
package: curl: true
package: bash: "=5.1.0-r0"
package: jq: "~=1.6"
}
shell: path: "/bin/bash"
always: true
env: {
METHOD: method
HEADERS: json.Marshal(request.header)
BODY: request.body
URL: url
}
if request.token != null {
secret: "/token": request.token
}
command: #"""
curlArgs=(
"$URL"
-L --fail --silent --show-error
--write-out "%{http_code}"
-X "$METHOD"
-d "$BODY"
-o /response
)
headers="$(echo $HEADERS | jq -r 'to_entries | map(.key + ": " + (.value | tostring) + "\n") | add')"
while read h; do
curlArgs+=("-H" "$h")
done <<< "$headers"
if [ -e /token ]; then
curlArgs+=("-H" "Authorization: bearer $(cat /token)")
fi
curl "${curlArgs[@]}" > /status
"""#
}
response: {
body: {
os.#File & {
from: ctr
path: "/response"
}
}.contents @dagger(output)
statusCode: strconv.Atoi({
os.#File & {
from: ctr
path: "/status"
}
}.contents) @dagger(output)
}
}

View File

@@ -0,0 +1,42 @@
package http
import (
"encoding/json"
"alpha.dagger.io/alpine"
"alpha.dagger.io/os"
)
TestRequest: {
req: #Get & {
url: "https://api.github.com/"
request: header: {
Accept: "application/json"
Test: ["A", "B"]
}
}
testRaw: os.#Container & {
image: alpine.#Image & {
package: jq: "~=1.6"
}
env: STATUS: "\(req.response.statusCode)"
files: "/content.json": {
content: req.response.body
mode: 0o500
}
command: #"""
test "$STATUS" = 200
test "$(cat /content.json | jq -r .current_user_url)" = "https://api.github.com/user"
"""#
}
testJSON: os.#Container & {
env: STATUS: "\(req.response.statusCode)"
env: CONTENT: json.Unmarshal(req.response.body).current_user_url
command: """
test "$STATUS" = 200
test "$CONTENT" = "https://api.github.com/user"
"""
}
}