You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2019/11/08 19:19:48 UTC
[trafficserver] 03/04: Change API to return a TSReturnCode code.
This is an automated email from the ASF dual-hosted git repository.
zwoop pushed a commit to branch 9.0.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git
commit db47ab74b62d4efe7f93bc546f08f878f9aaf167
Author: David Calavera <da...@gmail.com>
AuthorDate: Tue Oct 29 09:30:24 2019 -0700
Change API to return a TSReturnCode code.
Return a TS_ERROR when we cannot push the url to the promise table.
Signed-off-by: David Calavera <da...@gmail.com>
(cherry picked from commit 4960789e3306dca7968a74ebd4f9eba4d45e1d2a)
---
.../api/functions/TSHttpTxnServerPush.en.rst | 5 ++-
include/ts/ts.h | 2 +-
proxy/http2/Http2ConnectionState.cc | 11 +++---
proxy/http2/Http2ConnectionState.h | 2 +-
proxy/http2/Http2Stream.cc | 4 +--
proxy/http2/Http2Stream.h | 2 +-
src/traffic_server/InkAPI.cc | 41 ++++++++++++++--------
7 files changed, 41 insertions(+), 26 deletions(-)
diff --git a/doc/developer-guide/api/functions/TSHttpTxnServerPush.en.rst b/doc/developer-guide/api/functions/TSHttpTxnServerPush.en.rst
index be9ba1d..0710a07 100644
--- a/doc/developer-guide/api/functions/TSHttpTxnServerPush.en.rst
+++ b/doc/developer-guide/api/functions/TSHttpTxnServerPush.en.rst
@@ -28,7 +28,7 @@ Synopsis
#include <ts/ts.h>
-.. function:: void TSHttpTxnServerPush(TSHttpTxn txnp, const char *url, int url_len)
+.. function:: TSReturnCode TSHttpTxnServerPush(TSHttpTxn txnp, const char *url, int url_len)
Description
===========
@@ -40,6 +40,9 @@ is not disabled by the client. You can call this API without checking whether
Server Push is available on the transaction and it does nothing if Server Push
is not available.
+This API returns an error if the URL to push is not valid, the client has Server Push disabled,
+or there is an error creating the H/2 PUSH_PROMISE frame.
+
See Also
========
diff --git a/include/ts/ts.h b/include/ts/ts.h
index 17748d4..79ad523 100644
--- a/include/ts/ts.h
+++ b/include/ts/ts.h
@@ -2542,7 +2542,7 @@ tsapi TSIOBufferReader TSHttpTxnPostBufferReaderGet(TSHttpTxn txnp);
* @param url the URL string to preload.
* @param url_len the length of the URL string.
*/
-tsapi void TSHttpTxnServerPush(TSHttpTxn txnp, const char *url, int url_len);
+tsapi TSReturnCode TSHttpTxnServerPush(TSHttpTxn txnp, const char *url, int url_len);
#ifdef __cplusplus
}
diff --git a/proxy/http2/Http2ConnectionState.cc b/proxy/http2/Http2ConnectionState.cc
index 7fb41ce..b23e0a5 100644
--- a/proxy/http2/Http2ConnectionState.cc
+++ b/proxy/http2/Http2ConnectionState.cc
@@ -1639,7 +1639,7 @@ Http2ConnectionState::send_headers_frame(Http2Stream *stream)
ats_free(buf);
}
-void
+bool
Http2ConnectionState::send_push_promise_frame(Http2Stream *stream, URL &url, const MIMEField *accept_encoding)
{
HTTPHdr h1_hdr, h2_hdr;
@@ -1651,7 +1651,7 @@ Http2ConnectionState::send_push_promise_frame(Http2Stream *stream, URL &url, con
uint8_t flags = 0x00;
if (client_settings.get(HTTP2_SETTINGS_ENABLE_PUSH) == 0) {
- return;
+ return false;
}
Http2StreamDebug(ua_session, stream->get_id(), "Send PUSH_PROMISE frame");
@@ -1681,14 +1681,14 @@ Http2ConnectionState::send_push_promise_frame(Http2Stream *stream, URL &url, con
buf = static_cast<uint8_t *>(ats_malloc(buf_len));
if (buf == nullptr) {
h2_hdr.destroy();
- return;
+ return false;
}
Http2ErrorCode result = http2_encode_header_blocks(&h2_hdr, buf, buf_len, &header_blocks_size, *(this->remote_hpack_handle),
client_settings.get(HTTP2_SETTINGS_HEADER_TABLE_SIZE));
if (result != Http2ErrorCode::HTTP2_ERROR_NO_ERROR) {
h2_hdr.destroy();
ats_free(buf);
- return;
+ return false;
}
// Send a PUSH_PROMISE frame
@@ -1736,7 +1736,7 @@ Http2ConnectionState::send_push_promise_frame(Http2Stream *stream, URL &url, con
stream = this->create_stream(id, error);
if (!stream) {
h2_hdr.destroy();
- return;
+ return false;
}
SCOPED_MUTEX_LOCK(stream_lock, stream->mutex, this_ethread());
@@ -1759,6 +1759,7 @@ Http2ConnectionState::send_push_promise_frame(Http2Stream *stream, URL &url, con
stream->send_request(*this);
h2_hdr.destroy();
+ return true;
}
void
diff --git a/proxy/http2/Http2ConnectionState.h b/proxy/http2/Http2ConnectionState.h
index 01c80cf..afd4385 100644
--- a/proxy/http2/Http2ConnectionState.h
+++ b/proxy/http2/Http2ConnectionState.h
@@ -247,7 +247,7 @@ public:
void send_data_frames(Http2Stream *stream);
Http2SendDataFrameResult send_a_data_frame(Http2Stream *stream, size_t &payload_length);
void send_headers_frame(Http2Stream *stream);
- void send_push_promise_frame(Http2Stream *stream, URL &url, const MIMEField *accept_encoding);
+ bool send_push_promise_frame(Http2Stream *stream, URL &url, const MIMEField *accept_encoding);
void send_rst_stream_frame(Http2StreamId id, Http2ErrorCode ec);
void send_settings_frame(const Http2ConnectionSettings &new_settings);
void send_ping_frame(Http2StreamId id, uint8_t flag, const uint8_t *opaque_data);
diff --git a/proxy/http2/Http2Stream.cc b/proxy/http2/Http2Stream.cc
index 8d2d5c6..eb98c4c 100644
--- a/proxy/http2/Http2Stream.cc
+++ b/proxy/http2/Http2Stream.cc
@@ -683,12 +683,12 @@ Http2Stream::signal_write_event(bool call_update)
}
}
-void
+bool
Http2Stream::push_promise(URL &url, const MIMEField *accept_encoding)
{
Http2ClientSession *h2_proxy_ssn = static_cast<Http2ClientSession *>(this->_proxy_ssn);
SCOPED_MUTEX_LOCK(lock, h2_proxy_ssn->connection_state.mutex, this_ethread());
- h2_proxy_ssn->connection_state.send_push_promise_frame(this, url, accept_encoding);
+ return h2_proxy_ssn->connection_state.send_push_promise_frame(this, url, accept_encoding);
}
void
diff --git a/proxy/http2/Http2Stream.h b/proxy/http2/Http2Stream.h
index 58baee6..6a522a8 100644
--- a/proxy/http2/Http2Stream.h
+++ b/proxy/http2/Http2Stream.h
@@ -75,7 +75,7 @@ public:
void update_write_request(IOBufferReader *buf_reader, int64_t write_len, bool send_update);
void signal_write_event(bool call_update);
void restart_sending();
- void push_promise(URL &url, const MIMEField *accept_encoding);
+ bool push_promise(URL &url, const MIMEField *accept_encoding);
// Stream level window size
ssize_t client_rwnd() const;
diff --git a/src/traffic_server/InkAPI.cc b/src/traffic_server/InkAPI.cc
index 1d9dea3..fb910e0 100644
--- a/src/traffic_server/InkAPI.cc
+++ b/src/traffic_server/InkAPI.cc
@@ -8026,7 +8026,7 @@ TSHttpTxnIsInternal(TSHttpTxn txnp)
return TSHttpSsnIsInternal(TSHttpTxnSsnGet(txnp));
}
-void
+TSReturnCode
TSHttpTxnServerPush(TSHttpTxn txnp, const char *url, int url_len)
{
sdk_assert(sdk_sanity_check_txn(txnp) == TS_SUCCESS);
@@ -8035,26 +8035,37 @@ TSHttpTxnServerPush(TSHttpTxn txnp, const char *url, int url_len)
url_obj.create(nullptr);
if (url_obj.parse(url, url_len) == PARSE_RESULT_ERROR) {
url_obj.destroy();
- return;
+ return TS_ERROR;
}
HttpSM *sm = reinterpret_cast<HttpSM *>(txnp);
Http2Stream *stream = dynamic_cast<Http2Stream *>(sm->ua_txn);
- if (stream) {
- Http2ClientSession *ua_session = static_cast<Http2ClientSession *>(stream->get_proxy_ssn());
- SCOPED_MUTEX_LOCK(lock, ua_session->mutex, this_ethread());
- if (!ua_session->connection_state.is_state_closed() && !ua_session->is_url_pushed(url, url_len)) {
- HTTPHdr *hptr = &(sm->t_state.hdr_info.client_request);
- TSMLoc obj = reinterpret_cast<TSMLoc>(hptr->m_http);
-
- MIMEHdrImpl *mh = _hdr_mloc_to_mime_hdr_impl(obj);
- MIMEField *f = mime_hdr_field_find(mh, MIME_FIELD_ACCEPT_ENCODING, MIME_LEN_ACCEPT_ENCODING);
- stream->push_promise(url_obj, f);
-
- ua_session->add_url_to_pushed_table(url, url_len);
- }
+ if (stream == nullptr) {
+ url_obj.destroy();
+ return TS_ERROR;
+ }
+
+ Http2ClientSession *ua_session = static_cast<Http2ClientSession *>(stream->get_proxy_ssn());
+ SCOPED_MUTEX_LOCK(lock, ua_session->mutex, this_ethread());
+ if (ua_session->connection_state.is_state_closed() || ua_session->is_url_pushed(url, url_len)) {
+ url_obj.destroy();
+ return TS_ERROR;
}
+
+ HTTPHdr *hptr = &(sm->t_state.hdr_info.client_request);
+ TSMLoc obj = reinterpret_cast<TSMLoc>(hptr->m_http);
+
+ MIMEHdrImpl *mh = _hdr_mloc_to_mime_hdr_impl(obj);
+ MIMEField *f = mime_hdr_field_find(mh, MIME_FIELD_ACCEPT_ENCODING, MIME_LEN_ACCEPT_ENCODING);
+ if (!stream->push_promise(url_obj, f)) {
+ url_obj.destroy();
+ return TS_ERROR;
+ }
+
+ ua_session->add_url_to_pushed_table(url, url_len);
+
url_obj.destroy();
+ return TS_SUCCESS;
}
TSReturnCode