OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package prpc | 5 package prpc |
6 | 6 |
7 import ( | 7 import ( |
8 "bytes" | 8 "bytes" |
9 "encoding/base64" | 9 "encoding/base64" |
10 "fmt" | 10 "fmt" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 } | 44 } |
45 f, err := parseFormat(mediaType, mediaTypeParams) | 45 f, err := parseFormat(mediaType, mediaTypeParams) |
46 if err != nil { | 46 if err != nil { |
47 return f, err | 47 return f, err |
48 } | 48 } |
49 | 49 |
50 switch f { | 50 switch f { |
51 case formatUnrecognized: | 51 case formatUnrecognized: |
52 return f, fmt.Errorf("%q is not supported", contentType) | 52 return f, fmt.Errorf("%q is not supported", contentType) |
53 | 53 |
54 case formatUnspecified: | |
55 return formatBinary, nil | |
56 | |
57 case formatBinary, formatJSONPB, formatText: | 54 case formatBinary, formatJSONPB, formatText: |
58 return f, nil | 55 return f, nil |
59 | 56 |
60 default: | 57 default: |
61 » » panic("cannot happen") | 58 » » return formatBinary, nil |
62 } | 59 } |
63 } | 60 } |
64 | 61 |
65 // readMessage decodes a protobuf message from an HTTP request. | 62 // readMessage decodes a protobuf message from an HTTP request. |
66 // Does not close the request body. | 63 // Does not close the request body. |
67 func readMessage(r *http.Request, msg proto.Message) *httpError { | 64 func readMessage(r *http.Request, msg proto.Message) *protocolError { |
68 » if msg == nil { | |
69 » » panicf("cannot decode to nil") | |
70 » } | |
71 format, err := requestFormat(r.Header.Get(headerContentType)) | 65 format, err := requestFormat(r.Header.Get(headerContentType)) |
72 if err != nil { | 66 if err != nil { |
73 // Spec: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#
sec10.4.16 | 67 // Spec: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#
sec10.4.16 |
74 return errorf(http.StatusUnsupportedMediaType, "Content-Type hea
der: %s", err) | 68 return errorf(http.StatusUnsupportedMediaType, "Content-Type hea
der: %s", err) |
75 } | 69 } |
76 | 70 |
77 buf, err := ioutil.ReadAll(r.Body) | 71 buf, err := ioutil.ReadAll(r.Body) |
78 if err != nil { | 72 if err != nil { |
79 return errorf(http.StatusBadRequest, "could not read body: %s",
err) | 73 return errorf(http.StatusBadRequest, "could not read body: %s",
err) |
80 } | 74 } |
81 if len(buf) == 0 { | |
82 // no body, no message | |
83 return nil | |
84 } | |
85 | |
86 switch format { | 75 switch format { |
87 // Do not redefine "err" below. | 76 // Do not redefine "err" below. |
88 | 77 |
89 case formatBinary: | 78 case formatBinary: |
90 err = proto.Unmarshal(buf, msg) | 79 err = proto.Unmarshal(buf, msg) |
91 | 80 |
92 case formatJSONPB: | 81 case formatJSONPB: |
93 err = jsonpb.Unmarshal(bytes.NewBuffer(buf), msg) | 82 err = jsonpb.Unmarshal(bytes.NewBuffer(buf), msg) |
94 | 83 |
95 case formatText: | 84 case formatText: |
96 err = proto.UnmarshalText(string(buf), msg) | 85 err = proto.UnmarshalText(string(buf), msg) |
97 | 86 |
98 default: | 87 default: |
99 » » panicf("cannot happen") | 88 » » err = fmt.Errorf("unknown message format: %d", format) |
100 } | 89 } |
101 if err != nil { | 90 if err != nil { |
102 return errorf(http.StatusBadRequest, "could not decode body: %s"
, err) | 91 return errorf(http.StatusBadRequest, "could not decode body: %s"
, err) |
103 } | 92 } |
104 return nil | 93 return nil |
105 } | 94 } |
106 | 95 |
107 // parseHeader parses HTTP headers and derives a new context. | 96 // parseHeader parses HTTP headers and derives a new context. |
108 // Supports headerTimeout. | 97 // Supports headerTimeout. |
109 // Ignores "Accept" and "Content-Type" headers. | 98 // Ignores "Accept" and "Content-Type" headers. |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 } | 146 } |
158 md[trimmedName] = append(md[trimmedName], string
(decoded)) | 147 md[trimmedName] = append(md[trimmedName], string
(decoded)) |
159 } | 148 } |
160 } | 149 } |
161 } | 150 } |
162 if addedMeta { | 151 if addedMeta { |
163 c = metadata.NewContext(c, md) | 152 c = metadata.NewContext(c, md) |
164 } | 153 } |
165 return c, nil | 154 return c, nil |
166 } | 155 } |
OLD | NEW |