-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
private/protocol/restjson: Define JSONValue marshaling for body and q…
…uerystring (#1640) Adds support for APIs which use JSONValue for body and querystring targets. Fix #1636
- Loading branch information
Showing
12 changed files
with
745 additions
and
70 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
package protocol | ||
|
||
import ( | ||
"encoding/base64" | ||
"encoding/json" | ||
"fmt" | ||
"strconv" | ||
|
||
"github.com/aws/aws-sdk-go/aws" | ||
) | ||
|
||
// EscapeMode is the mode that should be use for escaping a value | ||
type EscapeMode uint | ||
|
||
// The modes for escaping a value before it is marshaled, and unmarshaled. | ||
const ( | ||
NoEscape EscapeMode = iota | ||
Base64Escape | ||
QuotedEscape | ||
) | ||
|
||
// EncodeJSONValue marshals the value into a JSON string, and optionally base64 | ||
// encodes the string before returning it. | ||
// | ||
// Will panic if the escape mode is unknown. | ||
func EncodeJSONValue(v aws.JSONValue, escape EscapeMode) (string, error) { | ||
b, err := json.Marshal(v) | ||
if err != nil { | ||
return "", err | ||
} | ||
|
||
switch escape { | ||
case NoEscape: | ||
return string(b), nil | ||
case Base64Escape: | ||
return base64.StdEncoding.EncodeToString(b), nil | ||
case QuotedEscape: | ||
return strconv.Quote(string(b)), nil | ||
} | ||
|
||
panic(fmt.Sprintf("EncodeJSONValue called with unknown EscapeMode, %v", escape)) | ||
} | ||
|
||
// DecodeJSONValue will attempt to decode the string input as a JSONValue. | ||
// Optionally decoding base64 the value first before JSON unmarshaling. | ||
// | ||
// Will panic if the escape mode is unknown. | ||
func DecodeJSONValue(v string, escape EscapeMode) (aws.JSONValue, error) { | ||
var b []byte | ||
var err error | ||
|
||
switch escape { | ||
case NoEscape: | ||
b = []byte(v) | ||
case Base64Escape: | ||
b, err = base64.StdEncoding.DecodeString(v) | ||
case QuotedEscape: | ||
var u string | ||
u, err = strconv.Unquote(v) | ||
b = []byte(u) | ||
default: | ||
panic(fmt.Sprintf("DecodeJSONValue called with unknown EscapeMode, %v", escape)) | ||
} | ||
|
||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
m := aws.JSONValue{} | ||
err = json.Unmarshal(b, &m) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
return m, nil | ||
} |
Oops, something went wrong.