(response *http.Response)
| 504 | } |
| 505 | |
| 506 | func (cc *connectUnaryClientConn) validateResponse(response *http.Response) *Error { |
| 507 | for k, v := range response.Header { |
| 508 | if !strings.HasPrefix(k, connectUnaryTrailerPrefix) { |
| 509 | cc.responseHeader[k] = v |
| 510 | continue |
| 511 | } |
| 512 | cc.responseTrailer[k[len(connectUnaryTrailerPrefix):]] = v |
| 513 | } |
| 514 | if err := connectValidateUnaryResponseContentType( |
| 515 | cc.marshaler.codec.Name(), |
| 516 | cc.duplexCall.Method(), |
| 517 | response.StatusCode, |
| 518 | response.Status, |
| 519 | getHeaderCanonical(response.Header, headerContentType), |
| 520 | ); err != nil { |
| 521 | if IsNotModifiedError(err) { |
| 522 | // Allow access to response headers for this kind of error. |
| 523 | // RFC 9110 doesn't allow trailers on 304s, so we only need to include headers. |
| 524 | err.meta = cc.responseHeader.Clone() |
| 525 | } |
| 526 | return err |
| 527 | } |
| 528 | compression := getHeaderCanonical(response.Header, connectUnaryHeaderCompression) |
| 529 | if compression != "" && |
| 530 | compression != compressionIdentity && |
| 531 | !cc.compressionPools.Contains(compression) { |
| 532 | return errorf( |
| 533 | CodeInternal, |
| 534 | "unknown encoding %q: accepted encodings are %v", |
| 535 | compression, |
| 536 | cc.compressionPools.CommaSeparatedNames(), |
| 537 | ) |
| 538 | } |
| 539 | cc.unmarshaler.compressionPool = cc.compressionPools.Get(compression) |
| 540 | if response.StatusCode != http.StatusOK { |
| 541 | unmarshaler := connectUnaryUnmarshaler{ |
| 542 | ctx: cc.unmarshaler.ctx, |
| 543 | reader: response.Body, |
| 544 | compressionPool: cc.unmarshaler.compressionPool, |
| 545 | bufferPool: cc.bufferPool, |
| 546 | } |
| 547 | var wireErr connectWireError |
| 548 | if err := unmarshaler.UnmarshalFunc(&wireErr, json.Unmarshal); err != nil { |
| 549 | return NewError( |
| 550 | httpToCode(response.StatusCode), |
| 551 | errors.New(response.Status), |
| 552 | ) |
| 553 | } |
| 554 | if wireErr.Code == 0 { |
| 555 | // code not set? default to one implied by HTTP status |
| 556 | wireErr.Code = httpToCode(response.StatusCode) |
| 557 | } |
| 558 | serverErr := wireErr.asError() |
| 559 | if serverErr == nil { |
| 560 | return nil |
| 561 | } |
| 562 | serverErr.meta = cc.responseHeader.Clone() |
| 563 | mergeHeaders(serverErr.meta, cc.responseTrailer) |
nothing calls this directly
no test coverage detected