fix: splited temperatures
Changes: - Split temperatures from log file into blocks. Every block has a size of 500 entries. Every block would be send to the remote host
This commit is contained in:
		@@ -5,6 +5,7 @@ import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"math"
 | 
			
		||||
	"net/http"
 | 
			
		||||
 | 
			
		||||
	"git.cryptic.systems/fh-trier/go-flucky/pkg/config"
 | 
			
		||||
@@ -20,34 +21,54 @@ func SendTemperatures(temperatures []*stypes.Temperature, configDir string) erro
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	temperaturesAsBytes, err := json.Marshal(temperatures)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("Can not marshal temperatures to JSON: %v", err)
 | 
			
		||||
	// split temperatures in blocks to reduce server data size in single request
 | 
			
		||||
	blockSize := 500
 | 
			
		||||
	temperatureBlocks := make(map[int][]*stypes.Temperature)
 | 
			
		||||
	length := int(math.Ceil(float64(len(temperatures)) / float64(blockSize)))
 | 
			
		||||
	for i := 0; i < length; i++ {
 | 
			
		||||
		start := i * blockSize
 | 
			
		||||
		end := (i + 1) * blockSize
 | 
			
		||||
 | 
			
		||||
		if end > len(temperatures) {
 | 
			
		||||
			end = len(temperatures)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		temperatureBlocks[i] = temperatures[start:end]
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	temperaturesAsReader := bytes.NewReader(temperaturesAsBytes)
 | 
			
		||||
 | 
			
		||||
	for _, remote := range cnf.Remotes {
 | 
			
		||||
 | 
			
		||||
		if remote.Enabled {
 | 
			
		||||
			requestURL := fmt.Sprintf("%s%s", remote.Address, "/temperatures")
 | 
			
		||||
			req, err := http.NewRequest("POST", requestURL, temperaturesAsReader)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			client := http.Client{}
 | 
			
		||||
			resp, err := client.Do(req)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			defer resp.Body.Close()
 | 
			
		||||
			for _, temperatureBlock := range temperatureBlocks {
 | 
			
		||||
 | 
			
		||||
			if resp.StatusCode < 200 || resp.StatusCode > 299 {
 | 
			
		||||
				b, err := ioutil.ReadAll(resp.Body)
 | 
			
		||||
				temperaturesAsBytes, err := json.Marshal(temperatureBlock)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return fmt.Errorf("Invalid HTTP-Statuscode - expected 200, got %d - can not read response body: %v", resp.StatusCode, err)
 | 
			
		||||
					return fmt.Errorf("Can not marshal temperatures to JSON: %v", err)
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				temperaturesAsReader := bytes.NewReader(temperaturesAsBytes)
 | 
			
		||||
 | 
			
		||||
				requestURL := fmt.Sprintf("%s%s", remote.Address, "/temperatures")
 | 
			
		||||
				req, err := http.NewRequest("POST", requestURL, temperaturesAsReader)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				client := http.Client{}
 | 
			
		||||
				resp, err := client.Do(req)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
				defer resp.Body.Close()
 | 
			
		||||
 | 
			
		||||
				if resp.StatusCode < 200 || resp.StatusCode > 299 {
 | 
			
		||||
					b, err := ioutil.ReadAll(resp.Body)
 | 
			
		||||
					if err != nil {
 | 
			
		||||
						return fmt.Errorf("Invalid HTTP-Statuscode - expected 200, got %d - can not read response body: %v", resp.StatusCode, err)
 | 
			
		||||
					}
 | 
			
		||||
					return fmt.Errorf("Invalid HTTP-Statuscode - expected 200, got %d: %v", resp.StatusCode, string(b))
 | 
			
		||||
				}
 | 
			
		||||
				return fmt.Errorf("Invalid HTTP-Statuscode - expected 200, got %d: %v", resp.StatusCode, string(b))
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user