post connects to the remote server and returns a Response struct
(url string, jsonData []byte)
| 132 | |
| 133 | // post connects to the remote server and returns a Response struct |
| 134 | func (srv *server) post(url string, jsonData []byte) (*api.Response, error) { |
| 135 | var resp *http.Response |
| 136 | var err error |
| 137 | client := &http.Client{} |
| 138 | if srv.TLSConfig != nil { |
| 139 | client.Transport = srv.createTransport() |
| 140 | } |
| 141 | if srv.RequestTimeout != 0 { |
| 142 | client.Timeout = srv.RequestTimeout |
| 143 | } |
| 144 | req, err := http.NewRequest("POST", url, bytes.NewReader(jsonData)) |
| 145 | if err != nil { |
| 146 | err = fmt.Errorf("failed POST to %s: %v", url, err) |
| 147 | return nil, errors.Wrap(errors.APIClientError, errors.ClientHTTPError, err) |
| 148 | } |
| 149 | req.Close = true |
| 150 | req.Header.Set("content-type", "application/json") |
| 151 | if srv.reqModifier != nil { |
| 152 | srv.reqModifier(req, jsonData) |
| 153 | } |
| 154 | resp, err = client.Do(req) |
| 155 | if err != nil { |
| 156 | err = fmt.Errorf("failed POST to %s: %v", url, err) |
| 157 | return nil, errors.Wrap(errors.APIClientError, errors.ClientHTTPError, err) |
| 158 | } |
| 159 | defer req.Body.Close() |
| 160 | defer resp.Body.Close() |
| 161 | body, err := io.ReadAll(resp.Body) |
| 162 | if err != nil { |
| 163 | return nil, errors.Wrap(errors.APIClientError, errors.IOError, err) |
| 164 | } |
| 165 | |
| 166 | if resp.StatusCode != http.StatusOK { |
| 167 | log.Errorf("http error with %s", url) |
| 168 | return nil, errors.Wrap(errors.APIClientError, errors.ClientHTTPError, stderr.New(string(body))) |
| 169 | } |
| 170 | |
| 171 | var response api.Response |
| 172 | err = json.Unmarshal(body, &response) |
| 173 | if err != nil { |
| 174 | log.Debug("Unable to parse response body:", string(body)) |
| 175 | return nil, errors.Wrap(errors.APIClientError, errors.JSONError, err) |
| 176 | } |
| 177 | |
| 178 | if !response.Success || response.Result == nil { |
| 179 | if len(response.Errors) > 0 { |
| 180 | return nil, errors.Wrap(errors.APIClientError, errors.ServerRequestFailed, stderr.New(response.Errors[0].Message)) |
| 181 | } |
| 182 | return nil, errors.New(errors.APIClientError, errors.ServerRequestFailed) |
| 183 | } |
| 184 | |
| 185 | return &response, nil |
| 186 | } |
| 187 | |
| 188 | // AuthSign fills out an authenticated signing request to the server, |
| 189 | // receiving a certificate or error in response. |