MCPcopy Create free account
hub / github.com/tailscale/tailscale / buildChild

Method buildChild

drive/driveimpl/remote_impl.go:116–199  ·  view source on GitHub ↗
(share *drive.Share)

Source from the content-addressed store, hash-verified

114}
115
116func (s *FileSystemForRemote) buildChild(share *drive.Share) *compositedav.Child {
117 getTokenAndAddr := func(shareName string) (string, string, error) {
118 s.mu.RLock()
119 var share *drive.Share
120 i, shareFound := slices.BinarySearchFunc(s.shares, shareName, func(s *drive.Share, name string) int {
121 return strings.Compare(s.Name, name)
122 })
123 if shareFound {
124 share = s.shares[i]
125 }
126 userServers := s.userServers
127 fileServerTokenAndAddr := s.fileServerTokenAndAddr
128 s.mu.RUnlock()
129
130 if !shareFound {
131 return "", "", fmt.Errorf("unknown share %v", shareName)
132 }
133
134 var tokenAndAddr string
135 if !drive.AllowShareAs() {
136 tokenAndAddr = fileServerTokenAndAddr
137 } else {
138 userServer, found := userServers[share.As]
139 if found {
140 userServer.mu.RLock()
141 tokenAndAddr = userServer.tokenAndAddr
142 userServer.mu.RUnlock()
143 }
144 }
145
146 if tokenAndAddr == "" {
147 return "", "", fmt.Errorf("unable to determine address for share %v", shareName)
148 }
149
150 parts := strings.Split(tokenAndAddr, "|")
151 if len(parts) != 2 {
152 return "", "", fmt.Errorf("invalid address for share %v", shareName)
153 }
154
155 return parts[0], parts[1], nil
156 }
157
158 return &compositedav.Child{
159 Child: &dirfs.Child{
160 Name: share.Name,
161 },
162 BaseURL: func() (string, error) {
163 secretToken, _, err := getTokenAndAddr(share.Name)
164 if err != nil {
165 return "", err
166 }
167 return fmt.Sprintf("http://%s/%s/%s", hex.EncodeToString([]byte(share.Name)), secretToken, url.PathEscape(share.Name)), nil
168 },
169 Transport: &http.Transport{
170 DialContext: func(ctx context.Context, _, shareAddr string) (net.Conn, error) {
171 shareNameHex, _, err := net.SplitHostPort(shareAddr)
172 if err != nil {
173 return nil, fmt.Errorf("unable to parse share address %v: %w", shareAddr, err)

Callers 1

SetSharesMethod · 0.95

Implementers 1

FileSystemForRemotedrive/driveimpl/remote_impl.go

Calls 6

DialContextMethod · 0.95
AllowShareAsFunction · 0.92
ConnectContextFunction · 0.92
SplitMethod · 0.80
ErrorfMethod · 0.65
CompareMethod · 0.45

Tested by

no test coverage detected