@@ -506,27 +506,37 @@ func (conn Conn) handleResponse(resp *http.Response, crc hash.Hash64) (*Response
506506 if statusCode >= 400 && statusCode <= 505 {
507507 // 4xx and 5xx indicate that the operation has error occurred
508508 var respBody []byte
509+ var errorXml []byte
509510 respBody , err := readResponseBody (resp )
510511 if err != nil {
511512 return nil , err
512513 }
513-
514- if len (respBody ) == 0 {
514+ errorXml = respBody
515+ if len (respBody ) == 0 && len (resp .Header .Get (HTTPHeaderOssErr )) > 0 {
516+ errorXml , err = base64 .StdEncoding .DecodeString (resp .Header .Get (HTTPHeaderOssErr ))
517+ if err != nil {
518+ errorXml = respBody
519+ }
520+ }
521+ if len (errorXml ) == 0 {
515522 err = ServiceError {
516523 StatusCode : statusCode ,
517524 RequestID : resp .Header .Get (HTTPHeaderOssRequestID ),
525+ Ec : resp .Header .Get (HTTPHeaderOssEc ),
518526 }
519527 } else {
520- // Response contains storage service error object, unmarshal
521- srvErr , errIn := serviceErrFromXML (respBody , resp .StatusCode ,
528+ srvErr , errIn := serviceErrFromXML (errorXml , resp .StatusCode ,
522529 resp .Header .Get (HTTPHeaderOssRequestID ))
523- if errIn != nil { // error unmarshaling the error response
524- err = fmt .Errorf ("oss: service returned invalid response body, status = %s, RequestId = %s" , resp .Status , resp .Header .Get (HTTPHeaderOssRequestID ))
530+ if errIn != nil { // error unmarshal the error response
531+ if len (resp .Header .Get (HTTPHeaderOssEc )) > 0 {
532+ err = fmt .Errorf ("oss: service returned invalid response body, status = %s, RequestId = %s, ec = %s" , resp .Status , resp .Header .Get (HTTPHeaderOssRequestID ), resp .Header .Get (HTTPHeaderOssEc ))
533+ } else {
534+ err = fmt .Errorf ("oss: service returned invalid response body, status = %s, RequestId = %s" , resp .Status , resp .Header .Get (HTTPHeaderOssRequestID ))
535+ }
525536 } else {
526537 err = srvErr
527538 }
528539 }
529-
530540 return & Response {
531541 StatusCode : resp .StatusCode ,
532542 Headers : resp .Header ,
@@ -544,27 +554,37 @@ func (conn Conn) handleResponse(resp *http.Response, crc hash.Hash64) (*Response
544554 // (0,300) [308,400) [506,)
545555 // Other extended http StatusCode
546556 var respBody []byte
557+ var errorXml []byte
547558 respBody , err := readResponseBody (resp )
548559 if err != nil {
549560 return & Response {StatusCode : resp .StatusCode , Headers : resp .Header , Body : ioutil .NopCloser (bytes .NewReader (respBody ))}, err
550561 }
551-
552- if len (respBody ) == 0 {
562+ errorXml = respBody
563+ if len (respBody ) == 0 && len (resp .Header .Get (HTTPHeaderOssErr )) > 0 {
564+ errorXml , err = base64 .StdEncoding .DecodeString (resp .Header .Get (HTTPHeaderOssErr ))
565+ if err != nil {
566+ errorXml = respBody
567+ }
568+ }
569+ if len (errorXml ) == 0 {
553570 err = ServiceError {
554571 StatusCode : statusCode ,
555572 RequestID : resp .Header .Get (HTTPHeaderOssRequestID ),
573+ Ec : resp .Header .Get (HTTPHeaderOssEc ),
556574 }
557575 } else {
558- // Response contains storage service error object, unmarshal
559- srvErr , errIn := serviceErrFromXML (respBody , resp .StatusCode ,
576+ srvErr , errIn := serviceErrFromXML (errorXml , resp .StatusCode ,
560577 resp .Header .Get (HTTPHeaderOssRequestID ))
561- if errIn != nil { // error unmarshaling the error response
562- err = fmt .Errorf ("unkown response body, status = %s, RequestId = %s" , resp .Status , resp .Header .Get (HTTPHeaderOssRequestID ))
578+ if errIn != nil { // error unmarshal the error response
579+ if len (resp .Header .Get (HTTPHeaderOssEc )) > 0 {
580+ err = fmt .Errorf ("oss: service returned invalid response body, status = %s, RequestId = %s, ec = %s" , resp .Status , resp .Header .Get (HTTPHeaderOssRequestID ), resp .Header .Get (HTTPHeaderOssEc ))
581+ } else {
582+ err = fmt .Errorf ("oss: service returned invalid response body, status = %s, RequestId = %s" , resp .Status , resp .Header .Get (HTTPHeaderOssRequestID ))
583+ }
563584 } else {
564585 err = srvErr
565586 }
566587 }
567-
568588 return & Response {
569589 StatusCode : resp .StatusCode ,
570590 Headers : resp .Header ,
0 commit comments