|
- // Copyright 2012-present Oliver Eilhard. All rights reserved.
- // Use of this source code is governed by a MIT-license.
- // See http://olivere.mit-license.org/license.txt for details.
-
- package elastic
-
- import (
- "encoding/json"
- "errors"
- "io"
- "io/ioutil"
- "net/http"
- )
-
- var (
- // ErrResponseSize is raised if a response body exceeds the given max body size.
- ErrResponseSize = errors.New("elastic: response size too large")
- )
-
- // Response represents a response from Elasticsearch.
- type Response struct {
- // StatusCode is the HTTP status code, e.g. 200.
- StatusCode int
- // Header is the HTTP header from the HTTP response.
- // Keys in the map are canonicalized (see http.CanonicalHeaderKey).
- Header http.Header
- // Body is the deserialized response body.
- Body json.RawMessage
- // DeprecationWarnings lists all deprecation warnings returned from
- // Elasticsearch.
- DeprecationWarnings []string
- }
-
- // newResponse creates a new response from the HTTP response.
- func (c *Client) newResponse(res *http.Response, maxBodySize int64) (*Response, error) {
- r := &Response{
- StatusCode: res.StatusCode,
- Header: res.Header,
- DeprecationWarnings: res.Header["Warning"],
- }
- if res.Body != nil {
- body := io.Reader(res.Body)
- if maxBodySize > 0 {
- if res.ContentLength > maxBodySize {
- return nil, ErrResponseSize
- }
- body = io.LimitReader(body, maxBodySize+1)
- }
- slurp, err := ioutil.ReadAll(body)
- if err != nil {
- return nil, err
- }
- if maxBodySize > 0 && int64(len(slurp)) > maxBodySize {
- return nil, ErrResponseSize
- }
- // HEAD requests return a body but no content
- if len(slurp) > 0 {
- r.Body = json.RawMessage(slurp)
- }
- }
- return r, nil
- }
|