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">"html/template"</span> 135 <span style="color:#e6db74">"net/http"</span> 136 <span style="color:#e6db74">"time"</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">"POST"</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">"url"</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">"name"</span>) 161 <span style="color:#a6e22e">store</span>[<span style="color:#a6e22e">name</span>] = <span style="color:#f92672">&</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">"/"</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"><style>input</span><span style="color:#e6db74">{</span><span style="color:#e6db74">width:400px;}</style> 166 </span><span style="color:#e6db74"><form method="post"> 167 </span><span style="color:#e6db74"> <input type="url" name="url" placeholder="URL of image we want to proxy to" /><br /> 168 </span><span style="color:#e6db74"> <input type="text" name="name" placeholder="name to display in shared URL eg: cute_cat.jpg" /><br /> 169 </span><span style="color:#e6db74"> <button type="submit">Create link</button> 170 </span><span style="color:#e6db74"></form></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">"/images/"</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">"X-Forwarded-For"</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">"/admin/"</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">""</span>).<span style="color:#a6e22e">Parse</span>(<span style="color:#e6db74">`</span><span style="color:#e6db74"> 199 </span><span style="color:#e6db74"><a href="/">Home</a><br /><br /> 200 </span><span style="color:#e6db74">Link to share: <a href="/images/</span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">.Name</span> <span style="color:#75715e">}}</span><span style="color:#e6db74">">/images/</span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">.Name</span> <span style="color:#75715e">}}</span><span style="color:#e6db74"></a><br /> 201 </span><span style="color:#e6db74"><table border="1"> 202 </span><span style="color:#e6db74"> <tr><th>RemoteAddr</th><th>XForwardedFor</th><th>UserAgent</th><th>CreatedAt</th></tr> 203 </span><span style="color:#e6db74"> </span><span style="color:#75715e">{{</span> <span style="color:#66d9ef">range</span> <span style="color:#a6e22e">.Requests</span> <span style="color:#75715e">}}</span><span style="color:#e6db74"> 204 </span><span style="color:#e6db74"> <tr><td></span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">.RemoteAddr</span> <span style="color:#75715e">}}</span><span style="color:#e6db74"></td><td></span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">.XForwardedFor</span> <span style="color:#75715e">}}</span><span style="color:#e6db74"></td><td></span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">.UserAgent</span> <span style="color:#75715e">}}</span><span style="color:#e6db74"></td><td></span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">.CreatedAt</span> <span style="color:#75715e">}}</span><span style="color:#e6db74"></td></tr> 205 </span><span style="color:#e6db74"> </span><span style="color:#75715e">{{</span> <span style="color:#66d9ef">else</span> <span style="color:#75715e">}}</span><span style="color:#e6db74"> 206 </span><span style="color:#e6db74"> <tr><td colspan="4">no request yet</td></tr> 207 </span><span style="color:#e6db74"> </span><span style="color:#75715e">{{</span> <span style="color:#66d9ef">end</span> <span style="color:#75715e">}}</span><span style="color:#e6db74"> 208 </span><span style="color:#e6db74"></table> 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">"Name"</span>: <span style="color:#a6e22e">name</span>, <span style="color:#e6db74">"Requests"</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">""</span>).<span style="color:#a6e22e">Parse</span>(<span style="color:#e6db74">`</span><span style="color:#e6db74"> 216 </span><span style="color:#e6db74"><a href="/create-link">Create link</a><br /><br /> 217 </span><span style="color:#e6db74"><h3>Links:</h3> 218 </span><span style="color:#e6db74"></span><span style="color:#75715e">{{</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">}}</span><span style="color:#e6db74"> 219 </span><span style="color:#e6db74"> <a href="/admin/</span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">$k</span> <span style="color:#75715e">}}</span><span style="color:#e6db74">"></span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">$k</span> <span style="color:#75715e">}}</span><span style="color:#e6db74"></a><br /> 220 </span><span style="color:#e6db74"></span><span style="color:#75715e">{{</span> <span style="color:#66d9ef">else</span> <span style="color:#75715e">}}</span><span style="color:#e6db74"> 221 </span><span style="color:#e6db74"> <em>no links yet</em> 222 </span><span style="color:#e6db74"></span><span style="color:#75715e">{{</span> <span style="color:#66d9ef">end</span> <span style="color:#75715e">}}</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">"Store"</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">"/create-link"</span>, <span style="color:#a6e22e">createLinkHandler</span>) 228 <span style="color:#a6e22e">http</span>.<span style="color:#a6e22e">HandleFunc</span>(<span style="color:#e6db74">"/images/"</span>, <span style="color:#a6e22e">imageHandler</span>) 229 <span style="color:#a6e22e">http</span>.<span style="color:#a6e22e">HandleFunc</span>(<span style="color:#e6db74">"/admin/"</span>, <span style="color:#a6e22e">adminHandler</span>) 230 <span style="color:#a6e22e">http</span>.<span style="color:#a6e22e">HandleFunc</span>(<span style="color:#e6db74">"/"</span>, <span style="color:#a6e22e">homeHandler</span>) 231 println(<span style="color:#e6db74">"starting webserver on 127.0.0.1:8080"</span>) 232 <span style="color:#a6e22e">_</span> = <span style="color:#a6e22e">http</span>.<span style="color:#a6e22e">ListenAndServe</span>(<span style="color:#e6db74">"127.0.0.1:8080"</span>, <span style="color:#66d9ef">nil</span>) 233 } 234 </pre></td></tr></table> 235 </div> 236 237 <!-- Code end --> 238 239 240 {{ end }}