@@ -112,7 +112,6 @@ func GenerateUserAvatarFastLink(userName string, size int) string {
112112 if size < 0 {
113113 size = 0
114114 }
115- //AppSubURL: It is either "" or starts with '/' and ends without '/', such as '/{subpath}'. question: should we use AppURL or StaticURLPrefix?
116115 return setting .AppSubURL + "/user/avatar/" + userName + "/" + strconv .Itoa (size )
117116}
118117
@@ -124,6 +123,17 @@ func GenerateUserAvatarImageLink(userAvatar string, size int) string {
124123 return setting .AppSubURL + "/avatars/" + userAvatar
125124}
126125
126+ // generateRecognizedAvatarURL generate a recognized avatar (Gravatar/Libravatar) URL, it modifies the URL so the parameter is passed by a copy
127+ func generateRecognizedAvatarURL (u url.URL , size int ) string {
128+ urlQuery := u .Query ()
129+ urlQuery .Set ("d" , "identicon" )
130+ if size > 0 {
131+ urlQuery .Set ("s" , strconv .Itoa (size ))
132+ }
133+ u .RawQuery = urlQuery .Encode ()
134+ return u .String ()
135+ }
136+
127137// generateEmailAvatarLink returns a email avatar link.
128138// if final is true, it may use a slow path (eg: query DNS).
129139// if final is false, it always uses a fast path.
@@ -133,36 +143,30 @@ func generateEmailAvatarLink(email string, size int, final bool) string {
133143 return DefaultAvatarLink ()
134144 }
135145
136- var avatarURL * url.URL
137146 var err error
138-
139147 if setting .EnableFederatedAvatar && setting .LibravatarService != nil {
140148 emailHash := saveEmailHash (email )
141149 if final {
150+ // for final link, we can spend more time on slow external query
151+ var avatarURL * url.URL
142152 if avatarURL , err = LibravatarURL (email ); err != nil {
143153 return DefaultAvatarLink ()
144154 }
145- } else {
146- if size > 0 {
147- return setting .AppSubURL + "/avatar/" + emailHash + "?size=" + strconv .Itoa (size )
148- }
149- return setting .AppSubURL + "/avatar/" + emailHash
155+ return generateRecognizedAvatarURL (* avatarURL , size )
156+ }
157+ // for non-final link, we should return fast (use a 302 redirection link)
158+ urlStr := setting .AppSubURL + "/avatar/" + emailHash
159+ if size > 0 {
160+ urlStr += "?size=" + strconv .Itoa (size )
150161 }
162+ return urlStr
151163 } else if ! setting .DisableGravatar {
152- avatarURLDummy := * setting .GravatarSourceURL // copy GravatarSourceURL, because we will modify its Path.
153- avatarURL = & avatarURLDummy
154- avatarURL .Path = path .Join (avatarURL .Path , HashEmail (email ))
155- } else {
156- return DefaultAvatarLink ()
157- }
158-
159- urlQuery := avatarURL .Query ()
160- urlQuery .Set ("d" , "identicon" )
161- if size > 0 {
162- urlQuery .Set ("s" , strconv .Itoa (size ))
164+ // copy GravatarSourceURL, because we will modify its Path.
165+ avatarURLCopy := * setting .GravatarSourceURL
166+ avatarURLCopy .Path = path .Join (avatarURLCopy .Path , HashEmail (email ))
167+ return generateRecognizedAvatarURL (avatarURLCopy , size )
163168 }
164- avatarURL .RawQuery = urlQuery .Encode ()
165- return avatarURL .String ()
169+ return DefaultAvatarLink ()
166170}
167171
168172//GenerateEmailAvatarFastLink returns a avatar link (fast, the link may be a delegated one: "/avatar/${hash}")
0 commit comments