(ctx context.Context, r *http.Request, maxSize int)
| 123 | } |
| 124 | |
| 125 | func decodeOTLPWriteRequest(ctx context.Context, r *http.Request, maxSize int) (pmetricotlp.ExportRequest, error) { |
| 126 | expectedSize := int(r.ContentLength) |
| 127 | if expectedSize > maxSize { |
| 128 | return pmetricotlp.NewExportRequest(), fmt.Errorf("received message larger than max (%d vs %d)", expectedSize, maxSize) |
| 129 | } |
| 130 | |
| 131 | contentType := r.Header.Get("Content-Type") |
| 132 | contentEncoding := r.Header.Get("Content-Encoding") |
| 133 | |
| 134 | var compressionType util.CompressionType |
| 135 | switch contentEncoding { |
| 136 | case "gzip": |
| 137 | compressionType = util.Gzip |
| 138 | case "": |
| 139 | compressionType = util.NoCompression |
| 140 | default: |
| 141 | return pmetricotlp.NewExportRequest(), fmt.Errorf("unsupported compression: %s, Supported compression types are \"gzip\" or '' (no compression)", contentEncoding) |
| 142 | } |
| 143 | |
| 144 | var decoderFunc func(reader io.Reader) (pmetricotlp.ExportRequest, error) |
| 145 | switch contentType { |
| 146 | case pbContentType: |
| 147 | decoderFunc = func(reader io.Reader) (pmetricotlp.ExportRequest, error) { |
| 148 | req := pmetricotlp.NewExportRequest() |
| 149 | otlpReqProto := otlpProtoMessage{req: &req} |
| 150 | return req, util.ParseProtoReader(ctx, reader, expectedSize, maxSize, otlpReqProto, compressionType) |
| 151 | } |
| 152 | case jsonContentType: |
| 153 | decoderFunc = func(reader io.Reader) (pmetricotlp.ExportRequest, error) { |
| 154 | req := pmetricotlp.NewExportRequest() |
| 155 | |
| 156 | reader = io.LimitReader(reader, int64(maxSize)+1) |
| 157 | if compressionType == util.Gzip { |
| 158 | var err error |
| 159 | reader, err = gzip.NewReader(reader) |
| 160 | if err != nil { |
| 161 | return req, err |
| 162 | } |
| 163 | reader = io.LimitReader(reader, int64(maxSize)+1) |
| 164 | } |
| 165 | |
| 166 | var buf bytes.Buffer |
| 167 | if expectedSize > 0 { |
| 168 | buf.Grow(expectedSize + bytes.MinRead) // extra space guarantees no reallocation |
| 169 | } |
| 170 | _, err := buf.ReadFrom(reader) |
| 171 | if err != nil { |
| 172 | return req, err |
| 173 | } |
| 174 | |
| 175 | return req, req.UnmarshalJSON(buf.Bytes()) |
| 176 | } |
| 177 | default: |
| 178 | return pmetricotlp.NewExportRequest(), fmt.Errorf("unsupported content type: %s, supported: [%s, %s]", contentType, jsonContentType, pbContentType) |
| 179 | } |
| 180 | |
| 181 | return decoderFunc(r.Body) |
| 182 | } |
no test coverage detected