func TestGetFromContextWithGlobalAndPrivateForwardedIps(t *testing.T) { var ctx iris.Context ctx.RequestCtx = &fasthttp.RequestCtx{} header := fasthttp.RequestHeader{} header.Add("X-Forwarded-For", "65.55.37.104, 100.64.0.0, 192.168.0.0, 192.0.0.0") ctx.RequestCtx.Request.Header = header ip := GetFromContext(&ctx) assert.Equal(t, ip, "65.55.37.104", "Should be the first ip, which is the global ip address.") }
func TestGetFromContextWithPrivateForwadedIp(t *testing.T) { var ctx iris.Context ctx.RequestCtx = &fasthttp.RequestCtx{} header := fasthttp.RequestHeader{} header.Add("X-Forwarded-For", "100.64.0.0, 192.168.0.0") ctx.RequestCtx.Request.Header = header ip := GetFromContext(&ctx) assert.Equal(t, ip, "", "Should not find an ip address.") }
func fetchFromUpstream(h *fasthttp.RequestHeader, key []byte) *ybc.Item { upstreamUrl := fmt.Sprintf("%s://%s%s", *upstreamProtocol, *upstreamHost, h.RequestURI()) var req fasthttp.Request req.SetRequestURI(upstreamUrl) var resp fasthttp.Response err := upstreamClient.Do(&req, &resp) if err != nil { logRequestError(h, "Cannot make request for [%s]: [%s]", key, err) return nil } if resp.StatusCode() != fasthttp.StatusOK { logRequestError(h, "Unexpected status code=%d for the response [%s]", resp.StatusCode(), key) return nil } contentType := string(resp.Header.ContentType()) if contentType == "" { contentType = "application/octet-stream" } body := resp.Body() contentLength := len(body) itemSize := contentLength + len(contentType) + 1 txn, err := cache.NewSetTxn(key, itemSize, ybc.MaxTtl) if err != nil { logRequestError(h, "Cannot start set txn for response [%s], itemSize=%d: [%s]", key, itemSize, err) return nil } if err = storeContentType(h, txn, contentType); err != nil { txn.Rollback() return nil } n, err := txn.Write(body) if err != nil { logRequestError(h, "Cannot read response [%s] body with size=%d to cache: [%s]", key, contentLength, err) txn.Rollback() return nil } if n != contentLength { logRequestError(h, "Unexpected number of bytes copied=%d from response [%s] to cache. Expected %d", n, key, contentLength) txn.Rollback() return nil } item, err := txn.CommitItem() if err != nil { logRequestError(h, "Cannot commit set txn for response [%s], size=%d: [%s]", key, contentLength, err) return nil } atomic.AddInt64(&stats.BytesReadFromUpstream, int64(n)) return item }
func logRequestError(h *fasthttp.RequestHeader, format string, args ...interface{}) { msg := fmt.Sprintf(format, args...) logMessage("%s - %s - %s. %s", h.RequestURI(), h.Referer(), h.UserAgent(), msg) }
func getRequestHost(h *fasthttp.RequestHeader) []byte { if *useClientRequestHost { return h.Host() } return upstreamHostBytes }