Redirect-short-links (#50)
* feat: redirect shortened URLs * feat: accept shortened URLs in converter * fix: tell resty not to follow redirect * fix: remove log
This commit is contained in:
parent
4760681c55
commit
2ef7e05f4b
2
.gitignore
vendored
2
.gitignore
vendored
@ -2,4 +2,4 @@
|
|||||||
docker-compose.yml
|
docker-compose.yml
|
||||||
.DS_Store
|
.DS_Store
|
||||||
*bin
|
*bin
|
||||||
/tmp
|
/tmp
|
||||||
|
2
main.go
2
main.go
@ -50,6 +50,8 @@ func main() {
|
|||||||
r.GET("/", routes.GetHome)
|
r.GET("/", routes.GetHome)
|
||||||
r.POST("/", routes.PostHome)
|
r.POST("/", routes.PostHome)
|
||||||
|
|
||||||
|
r.GET("/a/:id", routes.RedirectShortenedOverflowURL)
|
||||||
|
|
||||||
r.GET("/questions/:id", func(c *gin.Context) {
|
r.GET("/questions/:id", func(c *gin.Context) {
|
||||||
// redirect user to the question with the title
|
// redirect user to the question with the title
|
||||||
c.Redirect(302, fmt.Sprintf("/questions/%s/placeholder", c.Param("id")))
|
c.Redirect(302, fmt.Sprintf("/questions/%s/placeholder", c.Param("id")))
|
||||||
|
@ -35,10 +35,14 @@ func PostHome(c *gin.Context) {
|
|||||||
|
|
||||||
soLink := body.URL
|
soLink := body.URL
|
||||||
|
|
||||||
|
// remove the www.
|
||||||
|
soLink = strings.ReplaceAll(soLink, "www.", "")
|
||||||
|
|
||||||
// validate URL
|
// validate URL
|
||||||
isStackOverflow := strings.HasPrefix(soLink, "https://stackoverflow.com/questions/")
|
isStackOverflow := strings.HasPrefix(soLink, "https://stackoverflow.com/questions/")
|
||||||
|
isShortenedStackOverflow := strings.HasPrefix(soLink, "https://stackoverflow.com/a/")
|
||||||
isStackExchange := stackExchangeRegex.MatchString(soLink)
|
isStackExchange := stackExchangeRegex.MatchString(soLink)
|
||||||
if !isStackExchange && !isStackOverflow {
|
if !isStackExchange && !isStackOverflow && !isShortenedStackOverflow {
|
||||||
c.HTML(400, "home.html", gin.H{
|
c.HTML(400, "home.html", gin.H{
|
||||||
"errorMessage": "Invalid stack overflow/exchange URL",
|
"errorMessage": "Invalid stack overflow/exchange URL",
|
||||||
"theme": c.MustGet("theme").(string),
|
"theme": c.MustGet("theme").(string),
|
||||||
@ -47,7 +51,7 @@ func PostHome(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// if stack overflow, trim https://stackoverflow.com
|
// if stack overflow, trim https://stackoverflow.com
|
||||||
if isStackOverflow {
|
if isStackOverflow || isShortenedStackOverflow {
|
||||||
c.Redirect(302, strings.TrimPrefix(soLink, "https://stackoverflow.com"))
|
c.Redirect(302, strings.TrimPrefix(soLink, "https://stackoverflow.com"))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
44
src/routes/shortened.go
Normal file
44
src/routes/shortened.go
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
package routes
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"github.com/go-resty/resty/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
func RedirectShortenedOverflowURL(c *gin.Context) {
|
||||||
|
id := c.Param("id")
|
||||||
|
|
||||||
|
// fetch the stack overflow URL
|
||||||
|
client := resty.New()
|
||||||
|
client.SetRedirectPolicy(
|
||||||
|
resty.RedirectPolicyFunc(func(req *http.Request, via []*http.Request) error {
|
||||||
|
return http.ErrUseLastResponse
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
resp, err := client.R().Get(fmt.Sprintf("https://www.stackoverflow.com/a/%s", id))
|
||||||
|
if err != nil {
|
||||||
|
c.HTML(400, "home.html", gin.H{
|
||||||
|
"errorMessage": "Unable to fetch stack overflow URL",
|
||||||
|
"theme": c.MustGet("theme").(string),
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if resp.StatusCode() != 302 {
|
||||||
|
c.HTML(400, "home.html", gin.H{
|
||||||
|
"errorMessage": fmt.Sprintf("Unexpected HTTP status from origin: %d", resp.StatusCode()),
|
||||||
|
"theme": c.MustGet("theme").(string),
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the redirect URL
|
||||||
|
location := resp.Header().Get("Location")
|
||||||
|
|
||||||
|
c.Redirect(302, fmt.Sprintf("%s%s", os.Getenv("APP_URL"), location))
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user