Redirect URL ... Ruby / Python / golang / Nim

#cURL

```terminal
>curl -I -s 'http://idontknow.where.to.go/?redirect="' | grep 'location'
```

##Ruby

```ruby
require 'net/http'
require 'uri'

target_url ="http://idontknow.where.to.go/?redirect="

uri = URI.parse(target_url)

def get_url(uri)
    redirect = Net::HTTP.get_response(uri)['location']
    return redirect
end

redirect_url = get_url(uri)

puts redirect_url
```

----

##Python

```python
import requests

target_url = "http://idontknow.where.to.go/?redirect="

res = requests.get(target_url)
redirect_url = res.url

Print(redirect_url)
```

```hylang
;;hy 1.0a3 using CPython(default)

=> (import re)
=> (import requests)
=> (defn redirect [url]
... (setv res (requests.head url :allow_redirects False))
... (setv redirect_url (get res.headers "Location"))
... (print redirect_url)))
=> (redirect "http://idontknow.where.to.go/?redirect")

```

Or use http://pycurl.io/

```python
import pycurl

c = pycurl.Curl()

c.setopt(c.URL, 'http://idontknow.where.to.go/?redirect')
# Follow redirect.
c.setopt(c.FOLLOWLOCATION, 0) # True: 1 / False : 0 
c.perform()

print(c.getinfo(c.REDIRECT_URL))
print(c.getinfo(c.EFFECTIVE_URL))
c.close()
```

----
##Golang

```go
package main

import (
    "fmt"
    "net/http"
    )

func main(){
    const target_URL = "https://idontknow.where.to.go/?redirect="

    resp, _ := http.Get(target_URL)
    defer func() {
        resp.Body.Close()
    }()

    redirect_URL := resp.Request.URL.String()                                        
    fmt.Println(redirect_URL)
}

```

----
##Nim-lang

```nim
import httpclient

proc getRedirectTarget(domain: string): string =
  let client = newHttpClient(maxRedirects = 0)
  var redirected_url = domain
  var resp = client.head(redirected_url)
  while resp.headers.hasKey("location"):
    redirected_url = resp.headers["location"]
    #echo "redirected: ", redirected_url
    resp = client.head(redirected_url)
  return redirected_url

let targetUrl = "http://idontknow.where.to.go/?redirect="

echo "redirect: ", getRedirectTarget(targetUrl)
```

https://github.com/nim-lang/Nim/pull/18738


----
##Julia-lang

暫定的解決

```julia
using Pkg
Pkg.add("HTTP")
using HTTP

resHeader = HTTP.head("http://idontknow.where.to.go/?redirect=",redirect=false)
m = match(r"(?<=Location:\s).+(?=\r)",String(resHeader))
url_text = m.match
```

たぶん Location 取り出す方法は別にあるはず。

____

## Lua

http client はいくつかあるが、いちばん依存関係に問題が起こらなかったのは、Lua-cURLv3
Lua-cURLv3　は CURL なので、たぶん Lua が使える環境であればインストールで問題は起きない。他は環境（OS / CPU ）によってはコンパイルで依存するパッケージが非対応であったりすることが頻発するので、必ずしも便利なパッケージが使えるとは限らない。Lua-cURLv3 は、ドキュメントみても大事なことは書かれていないために、わかっている人が使うという感じだが、ドキュメントが親切な Python の pycurl を参照して概要をつかんでから調べると、ほぼ同じような使用法。だが、命名規則が CURL と違うので、メンテナンスしている人に質問するしかない。調べ方が悪くてわからない...ということではなく、知らないとわからないということでも、書いてない。

```lua
local curl = require('cURL')

local easy = curl.easy{
  url            = "http://idontknow.where.to.go/?redirect=",
  --followlocation = true,  -- true: 0
  followlocation = 0, -- false: 0
  maxredirs      = 3,
}

local buffer = {}
easy:setopt_writefunction(table.insert, buffer)
easy:perform()

local res_code = easy:getinfo_response_code()
local res_location = easy:getinfo_redirect_url()

----print(table.concat(buffer))

print('code: ',    res_code)
print('redirect:', res_location)

print('url: ', easy:getinfo_effective_url())
```