Skip to content

Commit f60dfa5

Browse files
Add www-Authenticate header (#2314)
* add www authenticate header * Update examples/internal/proto/examplepb/echo_service.proto Co-authored-by: Johan Brandhorst-Satzkorn <[email protected]> * implement add www-authenticate header * regenerate Co-authored-by: Johan Brandhorst-Satzkorn <[email protected]>
1 parent 8478702 commit f60dfa5

File tree

10 files changed

+513
-15
lines changed

10 files changed

+513
-15
lines changed

examples/internal/clients/echo/api/swagger.yaml

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,84 @@ paths:
447447
description: "An unexpected error response."
448448
schema:
449449
$ref: "#/definitions/rpcStatus"
450+
/v1/example/echo_unauthorized:
451+
get:
452+
tags:
453+
- "EchoService"
454+
summary: "EchoUnauthorized method receives a simple message and returns it.\
455+
\ It must\nalways return a google.rpc.Code of `UNAUTHENTICATED` and a HTTP\
456+
\ Status code\nof 401."
457+
operationId: "EchoService_EchoUnauthorized"
458+
parameters:
459+
- name: "id"
460+
in: "query"
461+
description: "Id represents the message identifier."
462+
required: false
463+
type: "string"
464+
x-exportParamName: "Id"
465+
x-optionalDataType: "String"
466+
- name: "num"
467+
in: "query"
468+
required: false
469+
type: "string"
470+
format: "int64"
471+
x-exportParamName: "Num"
472+
x-optionalDataType: "String"
473+
- name: "lineNum"
474+
in: "query"
475+
required: false
476+
type: "string"
477+
format: "int64"
478+
x-exportParamName: "LineNum"
479+
x-optionalDataType: "String"
480+
- name: "lang"
481+
in: "query"
482+
required: false
483+
type: "string"
484+
x-exportParamName: "Lang"
485+
x-optionalDataType: "String"
486+
- name: "status.progress"
487+
in: "query"
488+
required: false
489+
type: "string"
490+
format: "int64"
491+
x-exportParamName: "StatusProgress"
492+
x-optionalDataType: "String"
493+
- name: "status.note"
494+
in: "query"
495+
required: false
496+
type: "string"
497+
x-exportParamName: "StatusNote"
498+
x-optionalDataType: "String"
499+
- name: "en"
500+
in: "query"
501+
required: false
502+
type: "string"
503+
format: "int64"
504+
x-exportParamName: "En"
505+
x-optionalDataType: "String"
506+
- name: "no.progress"
507+
in: "query"
508+
required: false
509+
type: "string"
510+
format: "int64"
511+
x-exportParamName: "NoProgress"
512+
x-optionalDataType: "String"
513+
- name: "no.note"
514+
in: "query"
515+
required: false
516+
type: "string"
517+
x-exportParamName: "NoNote"
518+
x-optionalDataType: "String"
519+
responses:
520+
200:
521+
description: "A successful response."
522+
schema:
523+
$ref: "#/definitions/examplepbSimpleMessage"
524+
default:
525+
description: "An unexpected error response."
526+
schema:
527+
$ref: "#/definitions/rpcStatus"
450528
definitions:
451529
examplepbDynamicMessage:
452530
type: "object"

examples/internal/clients/echo/api_echo_service.go

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,3 +1037,150 @@ func (a *EchoServiceApiService) EchoServiceEchoPatch(ctx context.Context, body E
10371037

10381038
return localVarReturnValue, localVarHttpResponse, nil
10391039
}
1040+
1041+
/*
1042+
EchoServiceApiService EchoUnauthorized method receives a simple message and returns it. It must always return a google.rpc.Code of &#x60;UNAUTHENTICATED&#x60; and a HTTP Status code of 401.
1043+
* @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
1044+
* @param optional nil or *EchoServiceEchoUnauthorizedOpts - Optional Parameters:
1045+
* @param "Id" (optional.String) - Id represents the message identifier.
1046+
* @param "Num" (optional.String) -
1047+
* @param "LineNum" (optional.String) -
1048+
* @param "Lang" (optional.String) -
1049+
* @param "StatusProgress" (optional.String) -
1050+
* @param "StatusNote" (optional.String) -
1051+
* @param "En" (optional.String) -
1052+
* @param "NoProgress" (optional.String) -
1053+
* @param "NoNote" (optional.String) -
1054+
1055+
@return ExamplepbSimpleMessage
1056+
*/
1057+
1058+
type EchoServiceEchoUnauthorizedOpts struct {
1059+
Id optional.String
1060+
Num optional.String
1061+
LineNum optional.String
1062+
Lang optional.String
1063+
StatusProgress optional.String
1064+
StatusNote optional.String
1065+
En optional.String
1066+
NoProgress optional.String
1067+
NoNote optional.String
1068+
}
1069+
1070+
func (a *EchoServiceApiService) EchoServiceEchoUnauthorized(ctx context.Context, localVarOptionals *EchoServiceEchoUnauthorizedOpts) (ExamplepbSimpleMessage, *http.Response, error) {
1071+
var (
1072+
localVarHttpMethod = strings.ToUpper("Get")
1073+
localVarPostBody interface{}
1074+
localVarFileName string
1075+
localVarFileBytes []byte
1076+
localVarReturnValue ExamplepbSimpleMessage
1077+
)
1078+
1079+
// create path and map variables
1080+
localVarPath := a.client.cfg.BasePath + "/v1/example/echo_unauthorized"
1081+
1082+
localVarHeaderParams := make(map[string]string)
1083+
localVarQueryParams := url.Values{}
1084+
localVarFormParams := url.Values{}
1085+
1086+
if localVarOptionals != nil && localVarOptionals.Id.IsSet() {
1087+
localVarQueryParams.Add("id", parameterToString(localVarOptionals.Id.Value(), ""))
1088+
}
1089+
if localVarOptionals != nil && localVarOptionals.Num.IsSet() {
1090+
localVarQueryParams.Add("num", parameterToString(localVarOptionals.Num.Value(), ""))
1091+
}
1092+
if localVarOptionals != nil && localVarOptionals.LineNum.IsSet() {
1093+
localVarQueryParams.Add("lineNum", parameterToString(localVarOptionals.LineNum.Value(), ""))
1094+
}
1095+
if localVarOptionals != nil && localVarOptionals.Lang.IsSet() {
1096+
localVarQueryParams.Add("lang", parameterToString(localVarOptionals.Lang.Value(), ""))
1097+
}
1098+
if localVarOptionals != nil && localVarOptionals.StatusProgress.IsSet() {
1099+
localVarQueryParams.Add("status.progress", parameterToString(localVarOptionals.StatusProgress.Value(), ""))
1100+
}
1101+
if localVarOptionals != nil && localVarOptionals.StatusNote.IsSet() {
1102+
localVarQueryParams.Add("status.note", parameterToString(localVarOptionals.StatusNote.Value(), ""))
1103+
}
1104+
if localVarOptionals != nil && localVarOptionals.En.IsSet() {
1105+
localVarQueryParams.Add("en", parameterToString(localVarOptionals.En.Value(), ""))
1106+
}
1107+
if localVarOptionals != nil && localVarOptionals.NoProgress.IsSet() {
1108+
localVarQueryParams.Add("no.progress", parameterToString(localVarOptionals.NoProgress.Value(), ""))
1109+
}
1110+
if localVarOptionals != nil && localVarOptionals.NoNote.IsSet() {
1111+
localVarQueryParams.Add("no.note", parameterToString(localVarOptionals.NoNote.Value(), ""))
1112+
}
1113+
// to determine the Content-Type header
1114+
localVarHttpContentTypes := []string{"application/json"}
1115+
1116+
// set Content-Type header
1117+
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
1118+
if localVarHttpContentType != "" {
1119+
localVarHeaderParams["Content-Type"] = localVarHttpContentType
1120+
}
1121+
1122+
// to determine the Accept header
1123+
localVarHttpHeaderAccepts := []string{"application/json"}
1124+
1125+
// set Accept header
1126+
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
1127+
if localVarHttpHeaderAccept != "" {
1128+
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
1129+
}
1130+
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
1131+
if err != nil {
1132+
return localVarReturnValue, nil, err
1133+
}
1134+
1135+
localVarHttpResponse, err := a.client.callAPI(r)
1136+
if err != nil || localVarHttpResponse == nil {
1137+
return localVarReturnValue, localVarHttpResponse, err
1138+
}
1139+
1140+
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
1141+
localVarHttpResponse.Body.Close()
1142+
if err != nil {
1143+
return localVarReturnValue, localVarHttpResponse, err
1144+
}
1145+
1146+
if localVarHttpResponse.StatusCode < 300 {
1147+
// If we succeed, return the data, otherwise pass on to decode error.
1148+
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
1149+
if err == nil {
1150+
return localVarReturnValue, localVarHttpResponse, err
1151+
}
1152+
}
1153+
1154+
if localVarHttpResponse.StatusCode >= 300 {
1155+
newErr := GenericSwaggerError{
1156+
body: localVarBody,
1157+
error: localVarHttpResponse.Status,
1158+
}
1159+
1160+
if localVarHttpResponse.StatusCode == 200 {
1161+
var v ExamplepbSimpleMessage
1162+
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
1163+
if err != nil {
1164+
newErr.error = err.Error()
1165+
return localVarReturnValue, localVarHttpResponse, newErr
1166+
}
1167+
newErr.model = v
1168+
return localVarReturnValue, localVarHttpResponse, newErr
1169+
}
1170+
1171+
if localVarHttpResponse.StatusCode == 0 {
1172+
var v RpcStatus
1173+
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
1174+
if err != nil {
1175+
newErr.error = err.Error()
1176+
return localVarReturnValue, localVarHttpResponse, newErr
1177+
}
1178+
newErr.model = v
1179+
return localVarReturnValue, localVarHttpResponse, newErr
1180+
}
1181+
1182+
return localVarReturnValue, localVarHttpResponse, newErr
1183+
}
1184+
1185+
return localVarReturnValue, localVarHttpResponse, nil
1186+
}

examples/internal/integration/integration_test.go

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,38 @@ func TestEcho(t *testing.T) {
5656
}
5757
}
5858

59+
func TestEchoUnauthorized(t *testing.T) {
60+
if testing.Short() {
61+
t.Skip()
62+
return
63+
}
64+
apiURL := "http://localhost:8088/v1/example/echo_unauthorized"
65+
resp, err := http.Get(apiURL)
66+
if err != nil {
67+
t.Errorf("http.Get(%q) failed with %v; want success", apiURL, err)
68+
return
69+
}
70+
defer resp.Body.Close()
71+
buf, err := ioutil.ReadAll(resp.Body)
72+
if err != nil {
73+
t.Errorf("ioutil.ReadAll(resp.Body) failed with %v; want success", err)
74+
return
75+
}
76+
msg := new(statuspb.Status)
77+
if err := marshaler.Unmarshal(buf, msg); err != nil {
78+
t.Errorf("marshaler.Unmarshal(%s, msg) failed with %v; want success", buf, err)
79+
return
80+
}
81+
82+
if got, want := resp.StatusCode, http.StatusUnauthorized; got != want {
83+
t.Errorf("resp.StatusCode = %d; want %d", got, want)
84+
}
85+
86+
if value := resp.Header.Get("WWW-Authenticate"); value == "" {
87+
t.Errorf("WWW-Authenticate header should not be empty")
88+
}
89+
}
90+
5991
func TestEchoPatch(t *testing.T) {
6092
if testing.Short() {
6193
t.Skip()
@@ -1566,7 +1598,6 @@ func TestNotImplemented(t *testing.T) {
15661598
t.Errorf("ioutil.ReadAll(resp.Body) failed with %v; want success", err)
15671599
return
15681600
}
1569-
15701601
if got, want := resp.StatusCode, http.StatusNotImplemented; got != want {
15711602
t.Errorf("resp.StatusCode = %d; want %d", got, want)
15721603
t.Logf("%s", buf)

examples/internal/proto/examplepb/echo_service.pb.go

Lines changed: 27 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)