Skip to content

Commit c2d3cdc

Browse files
committed
Add API2 relative Location proof
1 parent 172a7ec commit c2d3cdc

2 files changed

Lines changed: 169 additions & 9 deletions

File tree

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
//go:build api2devdock
2+
3+
package main
4+
5+
import (
6+
"bytes"
7+
"context"
8+
"fmt"
9+
"net/http"
10+
"net/url"
11+
"time"
12+
13+
tusgo "github.com/bdragon300/tusgo"
14+
"github.com/bdragon300/tusgo/examples/api2devdock"
15+
)
16+
17+
func uploadWithRelativeLocationResolution(
18+
ctx context.Context,
19+
conformanceScenario map[string]interface{},
20+
) (map[string]interface{}, error) {
21+
endpointURLValue, err := api2devdock.TusConformanceInputStringOption(
22+
conformanceScenario,
23+
"endpointUrl",
24+
)
25+
if err != nil {
26+
return nil, err
27+
}
28+
endpointOrigin, err := url.Parse(endpointURLValue)
29+
if err != nil {
30+
return nil, err
31+
}
32+
metadata, err := api2devdock.TusConformanceInputStringMapOption(
33+
conformanceScenario,
34+
"metadata",
35+
)
36+
if err != nil {
37+
return nil, err
38+
}
39+
content, err := api2devdock.TusConformanceInputSourceBytes(conformanceScenario)
40+
if err != nil {
41+
return nil, err
42+
}
43+
capabilityPlan, err := api2devdock.TusConformanceServerCapabilities(conformanceScenario)
44+
if err != nil {
45+
return nil, err
46+
}
47+
48+
conformanceServer, err := api2devdock.NewTusConformancePlanServer(
49+
conformanceScenario,
50+
endpointOrigin,
51+
)
52+
if err != nil {
53+
return nil, err
54+
}
55+
defer conformanceServer.Close()
56+
localEndpointURL, err := conformanceServer.EndpointURL()
57+
if err != nil {
58+
return nil, err
59+
}
60+
61+
client := tusgo.NewClient(http.DefaultClient, localEndpointURL).WithContext(ctx)
62+
client.Capabilities = &tusgo.ServerCapabilities{
63+
Extensions: capabilityPlan.ExtensionNames,
64+
ProtocolVersions: capabilityPlan.ProtocolVersions,
65+
}
66+
upload, err := client.UploadWithURLStorage(tusgo.URLStorageUploadOptions{
67+
Context: ctx,
68+
Fingerprint: "api2-go-relative-location-conformance-fingerprint",
69+
Metadata: metadata,
70+
Size: int64(len(content)),
71+
Source: bytes.NewReader(content),
72+
Storage: tusgo.NewMemoryURLStorage(),
73+
})
74+
if err != nil {
75+
return nil, err
76+
}
77+
if upload == nil || upload.Location == "" {
78+
return nil, fmt.Errorf("relative-location TUS upload did not expose an upload URL")
79+
}
80+
if err := conformanceServer.AssertExhausted(); err != nil {
81+
return nil, err
82+
}
83+
84+
result, err := conformanceServer.Result()
85+
if err != nil {
86+
return nil, err
87+
}
88+
canonicalUploadURL, err := conformanceServer.CanonicalURL(upload.Location)
89+
if err != nil {
90+
return nil, err
91+
}
92+
result["uploadUrl"] = canonicalUploadURL
93+
94+
return result, nil
95+
}
96+
97+
func main() {
98+
ctx, cancel := context.WithTimeout(context.Background(), 90*time.Second)
99+
defer cancel()
100+
101+
scenario, err := api2devdock.LoadScenario(
102+
"examples/api2-devdock-tus-relative-location-resolution/api2-scenario.json",
103+
)
104+
if err != nil {
105+
api2devdock.Fail("load scenario: %v", err)
106+
}
107+
conformanceScenario, err := api2devdock.TusConformanceScenario(scenario)
108+
if err != nil {
109+
api2devdock.Fail("read conformance scenario: %v", err)
110+
}
111+
112+
result, err := uploadWithRelativeLocationResolution(ctx, conformanceScenario)
113+
if err != nil {
114+
api2devdock.Fail("relative Location resolution: %v", err)
115+
}
116+
if err := api2devdock.WriteResult(result); err != nil {
117+
api2devdock.Fail("write result: %v", err)
118+
}
119+
120+
scenarioID, err := api2devdock.ScenarioID(scenario)
121+
if err != nil {
122+
api2devdock.Fail("read scenario id: %v", err)
123+
}
124+
fmt.Printf("Go TUS SDK devdock scenario %s resolved %s\n", scenarioID, result["uploadUrl"])
125+
}

url_storage_generated.go

Lines changed: 44 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)