@@ -15,6 +15,7 @@ import (
15
15
"io/ioutil"
16
16
"net/http"
17
17
"net/url"
18
+ //"os"
18
19
"reflect"
19
20
"strconv"
20
21
"strings"
@@ -68,7 +69,7 @@ type Client struct {
68
69
// handleResponse specifies a function that is used to handle the response
69
70
// returned from server.
70
71
// This is used internally by tests for customizing response processing.
71
- handleResponse func (httpResp * http.Response , req Request ) (Result , error )
72
+ handleResponse func (httpResp * http.Response , req Request , serialVerUsed int16 ) (Result , error )
72
73
73
74
// isCloud represents whether the client connects to the cloud service or
74
75
// cloud simulator.
@@ -1103,7 +1104,7 @@ func (c *Client) doExecute(ctx context.Context, req Request, data []byte, serial
1103
1104
continue
1104
1105
}
1105
1106
1106
- result , err = c .handleResponse (httpResp , req )
1107
+ result , err = c .handleResponse (httpResp , req , serialVerUsed )
1107
1108
// Cancel request context after response body has been read.
1108
1109
reqCancel ()
1109
1110
if err != nil {
@@ -1348,14 +1349,20 @@ func (c *Client) signHTTPRequest(httpReq *http.Request) error {
1348
1349
// will be sent to the server. The serial version is always written followed by
1349
1350
// the actual request payload.
1350
1351
func (c * Client ) serializeRequest (req Request ) (data []byte , serialVerUsed int16 , err error ) {
1351
- wr := binary .NewWriter ()
1352
1352
serialVerUsed = c .serialVersion
1353
+ wr := binary .NewWriter ()
1353
1354
if _ , err = wr .WriteSerialVersion (serialVerUsed ); err != nil {
1354
1355
return nil , 0 , err
1355
1356
}
1356
1357
1357
- if err = req .serialize (wr , serialVerUsed ); err != nil {
1358
- return nil , 0 , err
1358
+ if serialVerUsed >= 4 {
1359
+ if err = req .serialize (wr , serialVerUsed ); err != nil {
1360
+ return nil , 0 , err
1361
+ }
1362
+ } else {
1363
+ if err = req .serializeV3 (wr , serialVerUsed ); err != nil {
1364
+ return nil , 0 , err
1365
+ }
1359
1366
}
1360
1367
1361
1368
return wr .Bytes (), serialVerUsed , nil
@@ -1366,7 +1373,7 @@ func (c *Client) serializeRequest(req Request) (data []byte, serialVerUsed int16
1366
1373
// If the http response status code is 200, this method reads in response
1367
1374
// content and parses them as an appropriate result suitable for the request.
1368
1375
// Otherwise, it returns the http error.
1369
- func (c * Client ) processResponse (httpResp * http.Response , req Request ) (Result , error ) {
1376
+ func (c * Client ) processResponse (httpResp * http.Response , req Request , serialVerUsed int16 ) (Result , error ) {
1370
1377
data , err := ioutil .ReadAll (httpResp .Body )
1371
1378
httpResp .Body .Close ()
1372
1379
if err != nil {
@@ -1375,31 +1382,41 @@ func (c *Client) processResponse(httpResp *http.Response, req Request) (Result,
1375
1382
1376
1383
if httpResp .StatusCode == http .StatusOK {
1377
1384
c .setSessionCookie (httpResp .Header )
1378
- return c .processOKResponse (data , req )
1385
+ return c .processOKResponse (data , req , serialVerUsed )
1379
1386
}
1380
1387
1381
1388
return nil , c .processNotOKResponse (data , httpResp .StatusCode )
1382
1389
}
1383
1390
1384
- func (c * Client ) processOKResponse (data []byte , req Request ) (Result , error ) {
1391
+ func (c * Client ) processOKResponse (data []byte , req Request , serialVerUsed int16 ) (res Result , err error ) {
1385
1392
buf := bytes .NewBuffer (data )
1386
1393
rd := binary .NewReader (buf )
1387
- code , err := rd .ReadByte ()
1394
+
1395
+ var code int
1396
+ if serialVerUsed >= 4 {
1397
+ if res , code , err = req .deserialize (rd , serialVerUsed ); err != nil {
1398
+ return nil , wrapResponseErrors (int (code ), err .Error ())
1399
+ }
1400
+ if queryReq , ok := req .(* QueryRequest ); ok && ! queryReq .isSimpleQuery () {
1401
+ queryReq .driver .client = c
1402
+ }
1403
+ return res , nil
1404
+ }
1405
+
1406
+ // V3
1407
+ bcode , err := rd .ReadByte ()
1388
1408
if err != nil {
1389
1409
return nil , err
1390
1410
}
1391
-
1411
+ code = int ( bcode )
1392
1412
// A zero byte represents the operation succeeded.
1393
1413
if code == 0 {
1394
- res , err := req .deserialize (rd , c .serialVersion )
1395
- if err != nil {
1414
+ if res , err = req .deserializeV3 (rd , serialVerUsed ); err != nil {
1396
1415
return nil , err
1397
1416
}
1398
-
1399
1417
if queryReq , ok := req .(* QueryRequest ); ok && ! queryReq .isSimpleQuery () {
1400
1418
queryReq .driver .client = c
1401
1419
}
1402
-
1403
1420
return res , nil
1404
1421
}
1405
1422
@@ -1548,6 +1565,7 @@ func (c *Client) decrementSerialVersion(serialVerUsed int16) bool {
1548
1565
}
1549
1566
if c .serialVersion > 2 {
1550
1567
c .serialVersion --
1568
+ c .logger .Fine ("Decremented serial version to %d\n " , c .serialVersion )
1551
1569
return true
1552
1570
}
1553
1571
return false
@@ -1558,6 +1576,11 @@ func (c *Client) GetSerialVersion() int16 {
1558
1576
return c .serialVersion
1559
1577
}
1560
1578
1579
+ // SetSerialVersion is used for tests. Do not use this in regular client code.
1580
+ func (c * Client ) SetSerialVersion (sVer int16 ) {
1581
+ c .serialVersion = sVer
1582
+ }
1583
+
1561
1584
func (c * Client ) oneTimeMessage (msg string ) {
1562
1585
if _ , ok := c .oneTimeMessages [msg ]; ok == false {
1563
1586
c .oneTimeMessages [msg ] = struct {}{}
0 commit comments