1

This code is a simple code for caching static resources. If data stored in memory? caching. If not stored in memory or expired? proxing and cached.

package main

import (
    "fmt"
    "strings"
    "sync"
    "time"

    "github.com/gofiber/fiber/v2"

    "github.com/gofiber/fiber/v2/middleware/proxy"
    "github.com/patrickmn/go-cache"
)

type cache_data struct {
    response_header map[string]string
    response_body   []byte
}

var caching_value = cache.New(5*time.Minute, 30*time.Minute)

var lhb_web_url string = "http://lhb-web.prd-lhb.svc.cluster.local"

var cacheMutex1 = &sync.Mutex{}

func call_web(c *fiber.Ctx) error {
    uri := c.OriginalURL()

    request_url := lhb_web_url + uri

    cacheMutex1.Lock()
    cachedVal, found := caching_value.Get(uri)

    if !found {
        if err := proxy.Do(c, request_url); err != nil {
            return err
        }

        will_caching := &cache_data{c.GetRespHeaders(), c.Response().Body()}

        fmt.Println("Data Store!")
        caching_value.Set(uri, will_caching, cache.DefaultExpiration)

        asdf, _ := caching_value.Get(uri)
        fmt.Println(asdf.(*cache_data).response_header)

        cacheMutex1.Unlock()

        return nil
    }
    cacheMutex1.Unlock()

    fmt.Println("Caching!")
    cachedData := cachedVal.(*cache_data)
    for k, v := range cachedData.response_header {
        c.Set(k, v)
    }
    c.Response().BodyWriter().Write(cachedData.response_body)

    return nil
}

func call_was_api(c *fiber.Ctx) error {
    var new_url string

    uri := c.OriginalURL()

    if strings.HasPrefix(uri, "/lhbtest") {
        new_url = lhb_web_url + uri
    } else {
        new_url = lhb_web_url + "/lhbtest" + uri
    }

    if err := proxy.Do(c, new_url); err != nil {
        return err
    }

    return nil
}

func main() {

    app := fiber.New()

    app.Get("/templates/*", call_web)
    app.Get("/css/*", call_web)
    app.Get("/download/*", call_web)
    app.Get("/images/*", call_web)
    app.Get("/js/*", call_web)
    app.Get("/module/*", call_web)
    app.Get("/imageView/*", call_web)

    app.Use("/", call_was_api)

    app.Listen(":80")
}

When i request to web page twice and watching log. Stored data and caching data is dirrent. Why? Since the header value is changed, rendering does not work.

[hhhjjj0918@asdfasd ~]$ k logs -f pathadd-99878fd74-fkdkc -n prd-lhb | grep  -A2 http://blahblah.com/js/jquery/jquery-3.3.1.min.js
http://blahblah.com/js/jquery/jquery-3.3.1.min.js
Data Store!
map[Accept-Ranges:bytes Content-Length:86927 Content-Type:application/javascript Date:Wed, 14 Jun 2023 05:22:58 GMT Etag:"644122c7-1538f" Last-Modified:Thu, 20 Apr 2023 11:32:23 GMT Server:nginx/1.24.0]
--
http://blahblah.com/js/jquery/jquery-3.3.1.min.js
Caching!
map[Accept-Ranges:bytes Content-Length:46727 Content-Type:image/jpegn/javascript Date:Wed, 14 Jun 2023 05:22:58 GMT Etag:bytesalive1538f" Last-Modified:Sun, 11 Jun 2023 11:18:54 GMT Server:nginx/1.24.0]
HHJ
  • 99
  • 1
  • 8

0 Answers0