func()

in log_store.go [366:457]


func (s *LogStore) PostLogStoreLogs(req *PostLogStoreLogsRequest) (err error) {
	if err = s.SetPutLogCompressType(req.CompressType); err != nil {
		return err
	}

	if req.LogGroup == nil || len(req.LogGroup.Logs) == 0 {
		// empty log group or empty hashkey
		return nil
	}

	if s.useMetricStoreURL {
		return s.PutLogs(req.LogGroup)
	}

	body, err := proto.Marshal(req.LogGroup)
	if err != nil {
		return NewClientError(err)
	}

	var out []byte
	var h map[string]string
	var outLen int
	switch s.putLogCompressType {
	case Compress_LZ4:
		// Compresse body with lz4
		out = make([]byte, lz4.CompressBlockBound(len(body)))
		var hashTable [1 << 16]int
		n, err := lz4.CompressBlock(body, out, hashTable[:])
		if err != nil {
			return NewClientError(err)
		}
		// copy incompressible data as lz4 format
		if n == 0 {
			n, _ = copyIncompressible(body, out)
		}

		h = map[string]string{
			"x-log-compresstype": "lz4",
			"x-log-bodyrawsize":  strconv.Itoa(len(body)),
			"Content-Type":       "application/x-protobuf",
		}
		outLen = n
	case Compress_ZSTD:
		// Compress body with zstd
		out, _ = slsZstdCompressor.Compress(body, nil)
		h = map[string]string{
			"x-log-compresstype": "zstd",
			"x-log-bodyrawsize":  strconv.Itoa(len(body)),
			"Content-Type":       "application/x-protobuf",
		}
		outLen = len(out)
	case Compress_None:
		// no compress
		out = body
		h = map[string]string{
			"x-log-bodyrawsize": strconv.Itoa(len(body)),
			"Content-Type":      "application/x-protobuf",
		}
		outLen = len(out)
	}

	var uri = fmt.Sprintf("/logstores/%s", s.Name)
	var params = url.Values{}
	if req.HashKey != nil && *req.HashKey != "" {
		params.Set("key", *req.HashKey)
		uri = fmt.Sprintf("/logstores/%s/shards/route", s.Name)
	}
	if req.Processor != "" {
		params.Set("processor", req.Processor)
	}
	if len(params) > 0 {
		uri = fmt.Sprintf("%s?%s", uri, params.Encode())
	}

	r, err := request(s.project, "POST", uri, h, out[:outLen])
	if err != nil {
		return NewClientError(err)
	}
	defer r.Body.Close()
	buf, err := ioutil.ReadAll(r.Body)
	if err != nil {
		return readResponseError(err)
	}
	if r.StatusCode != http.StatusOK {
		err := new(Error)
		if jErr := json.Unmarshal(buf, err); jErr != nil {
			return NewBadResponseError(string(buf), r.Header, r.StatusCode)
		}
		return err
	}
	return nil
}