dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

ip-grabber.gohtml (25834B)


      1 {{ define "sub-content" }}
      2 
      3 <nav aria-label="breadcrumb">
      4   <ol class="breadcrumb">
      5     <li class="breadcrumb-item"><a href="/vip">VIP</a></li>
      6     <li class="breadcrumb-item"><a href="/vip/projects">Projects</a></li>
      7     <li class="breadcrumb-item active">{{ t "IP grabber" . }}</li>
      8   </ol>
      9 </nav>
     10 
     11 <h3>IP grabber</h3>
     12 <p>
     13 	If you want to get someone's IP address, one way of achieving it is to have that person click on a link that point to a server that we control.<br />
     14 	This project starts a webserver where you can create links that will redirect to another address.<br />
     15 	For example, you would give the following link to the target https://www.awesome-cats-website.com/images/cute.png that would redirect to some random cat image on google search for example.<br />
     16 	But when the http request reaches our server, the request information is logged, and we get the request IP address, user-agent & timestamp.<br />
     17 	We now have all this information displayed in a table in our admin section https://www.awesome-cats-website.com/admin/cute.png<br />
     18 	The code below is a very simple implementation of this concept.<br />
     19 </p>
     20 
     21 <p>Full source code (golang):</p>
     22 
     23 <!-- Code begin -->
     24 <div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">
     25 	<table style="border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
     26 <pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">  1
     27 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">  2
     28 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">  3
     29 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">  4
     30 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">  5
     31 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">  6
     32 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">  7
     33 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">  8
     34 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">  9
     35 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 10
     36 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 11
     37 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 12
     38 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 13
     39 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 14
     40 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 15
     41 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 16
     42 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 17
     43 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 18
     44 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 19
     45 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 20
     46 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 21
     47 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 22
     48 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 23
     49 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 24
     50 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 25
     51 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 26
     52 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 27
     53 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 28
     54 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 29
     55 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 30
     56 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 31
     57 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 32
     58 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 33
     59 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 34
     60 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 35
     61 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 36
     62 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 37
     63 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 38
     64 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 39
     65 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 40
     66 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 41
     67 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 42
     68 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 43
     69 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 44
     70 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 45
     71 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 46
     72 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 47
     73 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 48
     74 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 49
     75 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 50
     76 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 51
     77 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 52
     78 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 53
     79 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 54
     80 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 55
     81 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 56
     82 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 57
     83 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 58
     84 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 59
     85 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 60
     86 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 61
     87 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 62
     88 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 63
     89 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 64
     90 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 65
     91 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 66
     92 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 67
     93 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 68
     94 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 69
     95 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 70
     96 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 71
     97 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 72
     98 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 73
     99 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 74
    100 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 75
    101 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 76
    102 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 77
    103 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 78
    104 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 79
    105 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 80
    106 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 81
    107 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 82
    108 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 83
    109 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 84
    110 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 85
    111 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 86
    112 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 87
    113 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 88
    114 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 89
    115 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 90
    116 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 91
    117 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 92
    118 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 93
    119 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 94
    120 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 95
    121 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 96
    122 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 97
    123 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 98
    124 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 99
    125 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">100
    126 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">101
    127 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">102
    128 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">103
    129 </span></pre></td>
    130 		<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
    131 <pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><span style="color:#f92672">package</span> <span style="color:#a6e22e">main</span>
    132 
    133 <span style="color:#f92672">import</span> (
    134 	<span style="color:#e6db74">&#34;html/template&#34;</span>
    135 	<span style="color:#e6db74">&#34;net/http&#34;</span>
    136 	<span style="color:#e6db74">&#34;time&#34;</span>
    137 )
    138 
    139 <span style="color:#66d9ef">type</span> <span style="color:#a6e22e">Request</span> <span style="color:#66d9ef">struct</span> {
    140 	<span style="color:#a6e22e">UserAgent</span>     <span style="color:#66d9ef">string</span>
    141 	<span style="color:#a6e22e">RemoteAddr</span>    <span style="color:#66d9ef">string</span>
    142 	<span style="color:#a6e22e">XForwardedFor</span> <span style="color:#66d9ef">string</span>
    143 	<span style="color:#a6e22e">CreatedAt</span>     <span style="color:#a6e22e">time</span>.<span style="color:#a6e22e">Time</span>
    144 }
    145 
    146 <span style="color:#66d9ef">type</span> <span style="color:#a6e22e">Item</span> <span style="color:#66d9ef">struct</span> {
    147 	<span style="color:#a6e22e">FileName</span>    <span style="color:#66d9ef">string</span>
    148 	<span style="color:#a6e22e">OriginalURL</span> <span style="color:#66d9ef">string</span>
    149 	<span style="color:#a6e22e">Requests</span>    []<span style="color:#a6e22e">Request</span>
    150 }
    151 
    152 <span style="color:#75715e">// We will use a memory store instead of a database to store the links and requests information
    153 </span><span style="color:#75715e"></span><span style="color:#75715e">// the use of this variable is not thread safe. But we keep the code simple.
    154 </span><span style="color:#75715e"></span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">store</span> = make(<span style="color:#66d9ef">map</span>[<span style="color:#66d9ef">string</span>]<span style="color:#f92672">*</span><span style="color:#a6e22e">Item</span>)
    155 
    156 <span style="color:#75715e">// Page to create a new link
    157 </span><span style="color:#75715e"></span><span style="color:#66d9ef">func</span> <span style="color:#a6e22e">createLinkHandler</span>(<span style="color:#a6e22e">w</span> <span style="color:#a6e22e">http</span>.<span style="color:#a6e22e">ResponseWriter</span>, <span style="color:#a6e22e">r</span> <span style="color:#f92672">*</span><span style="color:#a6e22e">http</span>.<span style="color:#a6e22e">Request</span>) {
    158 	<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">Method</span> <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;POST&#34;</span> {
    159 		<span style="color:#a6e22e">url</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">PostFormValue</span>(<span style="color:#e6db74">&#34;url&#34;</span>)
    160 		<span style="color:#a6e22e">name</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">PostFormValue</span>(<span style="color:#e6db74">&#34;name&#34;</span>)
    161 		<span style="color:#a6e22e">store</span>[<span style="color:#a6e22e">name</span>] = <span style="color:#f92672">&amp;</span><span style="color:#a6e22e">Item</span>{<span style="color:#a6e22e">FileName</span>: <span style="color:#a6e22e">name</span>, <span style="color:#a6e22e">OriginalURL</span>: <span style="color:#a6e22e">url</span>}
    162 		<span style="color:#a6e22e">http</span>.<span style="color:#a6e22e">Redirect</span>(<span style="color:#a6e22e">w</span>, <span style="color:#a6e22e">r</span>, <span style="color:#e6db74">&#34;/&#34;</span>, <span style="color:#a6e22e">http</span>.<span style="color:#a6e22e">StatusFound</span>)
    163 		<span style="color:#66d9ef">return</span>
    164 	}
    165 	<span style="color:#a6e22e">html</span> <span style="color:#f92672">:=</span> <span style="color:#e6db74">`</span><span style="color:#e6db74">&lt;style&gt;input</span><span style="color:#e6db74">{</span><span style="color:#e6db74">width:400px;}&lt;/style&gt;
    166 </span><span style="color:#e6db74">&lt;form method=&#34;post&#34;&gt;
    167 </span><span style="color:#e6db74">	&lt;input type=&#34;url&#34; name=&#34;url&#34; placeholder=&#34;URL of image we want to proxy to&#34; /&gt;&lt;br /&gt;
    168 </span><span style="color:#e6db74">	&lt;input type=&#34;text&#34; name=&#34;name&#34; placeholder=&#34;name to display in shared URL eg: cute_cat.jpg&#34; /&gt;&lt;br /&gt;
    169 </span><span style="color:#e6db74">	&lt;button type=&#34;submit&#34;&gt;Create link&lt;/button&gt;
    170 </span><span style="color:#e6db74">&lt;/form&gt;</span><span style="color:#e6db74">`</span>
    171 	<span style="color:#a6e22e">_</span>, <span style="color:#a6e22e">_</span> = <span style="color:#a6e22e">w</span>.<span style="color:#a6e22e">Write</span>([]byte(<span style="color:#a6e22e">html</span>))
    172 }
    173 
    174 <span style="color:#75715e">// Image page, log http request information and redirect to original image (eg: /images/cute-cat.jpg)
    175 </span><span style="color:#75715e"></span><span style="color:#66d9ef">func</span> <span style="color:#a6e22e">imageHandler</span>(<span style="color:#a6e22e">w</span> <span style="color:#a6e22e">http</span>.<span style="color:#a6e22e">ResponseWriter</span>, <span style="color:#a6e22e">r</span> <span style="color:#f92672">*</span><span style="color:#a6e22e">http</span>.<span style="color:#a6e22e">Request</span>) {
    176 	<span style="color:#a6e22e">name</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">URL</span>.<span style="color:#a6e22e">Path</span>[len(<span style="color:#e6db74">&#34;/images/&#34;</span>):]
    177 	<span style="color:#a6e22e">item</span>, <span style="color:#a6e22e">found</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">store</span>[<span style="color:#a6e22e">name</span>]
    178 	<span style="color:#66d9ef">if</span> !<span style="color:#a6e22e">found</span> {
    179 		<span style="color:#66d9ef">return</span>
    180 	}
    181 	<span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">Requests</span> = append(<span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">Requests</span>, <span style="color:#a6e22e">Request</span>{
    182 		<span style="color:#a6e22e">UserAgent</span>:     <span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">UserAgent</span>(),
    183 		<span style="color:#a6e22e">RemoteAddr</span>:    <span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">RemoteAddr</span>,
    184 		<span style="color:#a6e22e">XForwardedFor</span>: <span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">Header</span>.<span style="color:#a6e22e">Get</span>(<span style="color:#e6db74">&#34;X-Forwarded-For&#34;</span>),
    185 		<span style="color:#a6e22e">CreatedAt</span>:     <span style="color:#a6e22e">time</span>.<span style="color:#a6e22e">Now</span>(),
    186 	})
    187 	<span style="color:#a6e22e">store</span>[<span style="color:#a6e22e">name</span>] = <span style="color:#a6e22e">item</span>
    188 	<span style="color:#a6e22e">http</span>.<span style="color:#a6e22e">Redirect</span>(<span style="color:#a6e22e">w</span>, <span style="color:#a6e22e">r</span>, <span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">OriginalURL</span>, <span style="color:#a6e22e">http</span>.<span style="color:#a6e22e">StatusFound</span>)
    189 }
    190 
    191 <span style="color:#75715e">// Admin page, display requests made for a specific image (eg: /admin/cute-cat.jpg)
    192 </span><span style="color:#75715e"></span><span style="color:#66d9ef">func</span> <span style="color:#a6e22e">adminHandler</span>(<span style="color:#a6e22e">w</span> <span style="color:#a6e22e">http</span>.<span style="color:#a6e22e">ResponseWriter</span>, <span style="color:#a6e22e">r</span> <span style="color:#f92672">*</span><span style="color:#a6e22e">http</span>.<span style="color:#a6e22e">Request</span>) {
    193 	<span style="color:#a6e22e">name</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">URL</span>.<span style="color:#a6e22e">Path</span>[len(<span style="color:#e6db74">&#34;/admin/&#34;</span>):]
    194 	<span style="color:#a6e22e">item</span>, <span style="color:#a6e22e">found</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">store</span>[<span style="color:#a6e22e">name</span>]
    195 	<span style="color:#66d9ef">if</span> !<span style="color:#a6e22e">found</span> {
    196 		<span style="color:#66d9ef">return</span>
    197 	}
    198 	<span style="color:#a6e22e">tmpl</span>, <span style="color:#a6e22e">_</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">template</span>.<span style="color:#a6e22e">New</span>(<span style="color:#e6db74">&#34;&#34;</span>).<span style="color:#a6e22e">Parse</span>(<span style="color:#e6db74">`</span><span style="color:#e6db74">
    199 </span><span style="color:#e6db74">&lt;a href=&#34;/&#34;&gt;Home&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
    200 </span><span style="color:#e6db74">Link to share: &lt;a href=&#34;/images/</span><span style="color:#75715e">&#123;&#123;</span> <span style="color:#a6e22e">.Name</span> <span style="color:#75715e">&#125;&#125;</span><span style="color:#e6db74">&#34;&gt;/images/</span><span style="color:#75715e">&#123;&#123;</span> <span style="color:#a6e22e">.Name</span> <span style="color:#75715e">&#125;&#125;</span><span style="color:#e6db74">&lt;/a&gt;&lt;br /&gt;
    201 </span><span style="color:#e6db74">&lt;table border=&#34;1&#34;&gt;
    202 </span><span style="color:#e6db74">	&lt;tr&gt;&lt;th&gt;RemoteAddr&lt;/th&gt;&lt;th&gt;XForwardedFor&lt;/th&gt;&lt;th&gt;UserAgent&lt;/th&gt;&lt;th&gt;CreatedAt&lt;/th&gt;&lt;/tr&gt;
    203 </span><span style="color:#e6db74">	</span><span style="color:#75715e">&#123;&#123;</span> <span style="color:#66d9ef">range</span> <span style="color:#a6e22e">.Requests</span> <span style="color:#75715e">&#125;&#125;</span><span style="color:#e6db74">
    204 </span><span style="color:#e6db74">		&lt;tr&gt;&lt;td&gt;</span><span style="color:#75715e">&#123;&#123;</span> <span style="color:#a6e22e">.RemoteAddr</span> <span style="color:#75715e">&#125;&#125;</span><span style="color:#e6db74">&lt;/td&gt;&lt;td&gt;</span><span style="color:#75715e">&#123;&#123;</span> <span style="color:#a6e22e">.XForwardedFor</span> <span style="color:#75715e">&#125;&#125;</span><span style="color:#e6db74">&lt;/td&gt;&lt;td&gt;</span><span style="color:#75715e">&#123;&#123;</span> <span style="color:#a6e22e">.UserAgent</span> <span style="color:#75715e">&#125;&#125;</span><span style="color:#e6db74">&lt;/td&gt;&lt;td&gt;</span><span style="color:#75715e">&#123;&#123;</span> <span style="color:#a6e22e">.CreatedAt</span> <span style="color:#75715e">&#125;&#125;</span><span style="color:#e6db74">&lt;/td&gt;&lt;/tr&gt;
    205 </span><span style="color:#e6db74">	</span><span style="color:#75715e">&#123;&#123;</span> <span style="color:#66d9ef">else</span> <span style="color:#75715e">&#125;&#125;</span><span style="color:#e6db74">
    206 </span><span style="color:#e6db74">		&lt;tr&gt;&lt;td colspan=&#34;4&#34;&gt;no request yet&lt;/td&gt;&lt;/tr&gt;
    207 </span><span style="color:#e6db74">	</span><span style="color:#75715e">&#123;&#123;</span> <span style="color:#66d9ef">end</span> <span style="color:#75715e">&#125;&#125;</span><span style="color:#e6db74">
    208 </span><span style="color:#e6db74">&lt;/table&gt;
    209 </span><span style="color:#e6db74"></span><span style="color:#e6db74">`</span>)
    210 	<span style="color:#a6e22e">_</span> = <span style="color:#a6e22e">tmpl</span>.<span style="color:#a6e22e">Execute</span>(<span style="color:#a6e22e">w</span>, <span style="color:#66d9ef">map</span>[<span style="color:#66d9ef">string</span>]<span style="color:#66d9ef">interface</span>{}{<span style="color:#e6db74">&#34;Name&#34;</span>: <span style="color:#a6e22e">name</span>, <span style="color:#e6db74">&#34;Requests&#34;</span>: <span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">Requests</span>})
    211 }
    212 
    213 <span style="color:#75715e">// Home page, display existing links
    214 </span><span style="color:#75715e"></span><span style="color:#66d9ef">func</span> <span style="color:#a6e22e">homeHandler</span>(<span style="color:#a6e22e">w</span> <span style="color:#a6e22e">http</span>.<span style="color:#a6e22e">ResponseWriter</span>, <span style="color:#a6e22e">r</span> <span style="color:#f92672">*</span><span style="color:#a6e22e">http</span>.<span style="color:#a6e22e">Request</span>) {
    215 	<span style="color:#a6e22e">tmpl</span>, <span style="color:#a6e22e">_</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">template</span>.<span style="color:#a6e22e">New</span>(<span style="color:#e6db74">&#34;&#34;</span>).<span style="color:#a6e22e">Parse</span>(<span style="color:#e6db74">`</span><span style="color:#e6db74">
    216 </span><span style="color:#e6db74">&lt;a href=&#34;/create-link&#34;&gt;Create link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
    217 </span><span style="color:#e6db74">&lt;h3&gt;Links:&lt;/h3&gt;
    218 </span><span style="color:#e6db74"></span><span style="color:#75715e">&#123;&#123;</span> <span style="color:#66d9ef">range</span> <span style="color:#a6e22e">$k</span><span style="color:#f92672">,</span> <span style="color:#a6e22e">$v</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">.Store</span> <span style="color:#75715e">&#125;&#125;</span><span style="color:#e6db74">
    219 </span><span style="color:#e6db74">	&lt;a href=&#34;/admin/</span><span style="color:#75715e">&#123;&#123;</span> <span style="color:#a6e22e">$k</span> <span style="color:#75715e">&#125;&#125;</span><span style="color:#e6db74">&#34;&gt;</span><span style="color:#75715e">&#123;&#123;</span> <span style="color:#a6e22e">$k</span> <span style="color:#75715e">&#125;&#125;</span><span style="color:#e6db74">&lt;/a&gt;&lt;br /&gt;
    220 </span><span style="color:#e6db74"></span><span style="color:#75715e">&#123;&#123;</span> <span style="color:#66d9ef">else</span> <span style="color:#75715e">&#125;&#125;</span><span style="color:#e6db74">
    221 </span><span style="color:#e6db74">	&lt;em&gt;no links yet&lt;/em&gt;
    222 </span><span style="color:#e6db74"></span><span style="color:#75715e">&#123;&#123;</span> <span style="color:#66d9ef">end</span> <span style="color:#75715e">&#125;&#125;</span><span style="color:#e6db74">`</span>)
    223 	<span style="color:#a6e22e">_</span> = <span style="color:#a6e22e">tmpl</span>.<span style="color:#a6e22e">Execute</span>(<span style="color:#a6e22e">w</span>, <span style="color:#66d9ef">map</span>[<span style="color:#66d9ef">string</span>]<span style="color:#66d9ef">interface</span>{}{<span style="color:#e6db74">&#34;Store&#34;</span>: <span style="color:#a6e22e">store</span>})
    224 }
    225 
    226 <span style="color:#66d9ef">func</span> <span style="color:#a6e22e">main</span>() {
    227 	<span style="color:#a6e22e">http</span>.<span style="color:#a6e22e">HandleFunc</span>(<span style="color:#e6db74">&#34;/create-link&#34;</span>, <span style="color:#a6e22e">createLinkHandler</span>)
    228 	<span style="color:#a6e22e">http</span>.<span style="color:#a6e22e">HandleFunc</span>(<span style="color:#e6db74">&#34;/images/&#34;</span>, <span style="color:#a6e22e">imageHandler</span>)
    229 	<span style="color:#a6e22e">http</span>.<span style="color:#a6e22e">HandleFunc</span>(<span style="color:#e6db74">&#34;/admin/&#34;</span>, <span style="color:#a6e22e">adminHandler</span>)
    230 	<span style="color:#a6e22e">http</span>.<span style="color:#a6e22e">HandleFunc</span>(<span style="color:#e6db74">&#34;/&#34;</span>, <span style="color:#a6e22e">homeHandler</span>)
    231 	println(<span style="color:#e6db74">&#34;starting webserver on 127.0.0.1:8080&#34;</span>)
    232 	<span style="color:#a6e22e">_</span> = <span style="color:#a6e22e">http</span>.<span style="color:#a6e22e">ListenAndServe</span>(<span style="color:#e6db74">&#34;127.0.0.1:8080&#34;</span>, <span style="color:#66d9ef">nil</span>)
    233 }
    234 </pre></td></tr></table>
    235 </div>
    236 
    237 <!-- Code end -->
    238 
    239 
    240 {{ end }}