Add spdylay_npn_get_proto_list() public API function.
spdylay_npn_get_proto_list() returns a pointer to the supported SPDY version list. The element of the list is spdylay_npn_proto struct. It contains all SPDY version information this library supports. The application can use this information to configure NPN protocol offerings/selection.
This commit is contained in:
parent
cc15f4bd89
commit
4e5e741907
|
@ -1993,6 +1993,41 @@ int spdylay_submit_window_update(spdylay_session *session, int32_t stream_id,
|
||||||
int spdylay_select_next_protocol(unsigned char **out, unsigned char *outlen,
|
int spdylay_select_next_protocol(unsigned char **out, unsigned char *outlen,
|
||||||
const unsigned char *in, unsigned int inlen);
|
const unsigned char *in, unsigned int inlen);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @struct
|
||||||
|
*
|
||||||
|
* This struct contains SPDY version information this library
|
||||||
|
* supports.
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
/**
|
||||||
|
* SPDY protocol version name which can be used as TLS NPN protocol
|
||||||
|
* string.
|
||||||
|
*/
|
||||||
|
const unsigned char *proto;
|
||||||
|
/**
|
||||||
|
* The length of proto member.
|
||||||
|
*/
|
||||||
|
uint8_t len;
|
||||||
|
/**
|
||||||
|
* The corresponding SPDY version constant which can be passed to
|
||||||
|
* `spdylay_session_client_new()` and `spdylay_session_server_new()`
|
||||||
|
* as version argument.
|
||||||
|
*/
|
||||||
|
uint16_t version;
|
||||||
|
} spdylay_npn_proto;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function
|
||||||
|
*
|
||||||
|
* Returns a pointer to the supported SPDY version list. The number of
|
||||||
|
* elements in the list will be assigned to the |*len_ptr|. It
|
||||||
|
* contains all SPDY version information this library supports. The
|
||||||
|
* application can use this information to configure NPN protocol
|
||||||
|
* offerings/selection.
|
||||||
|
*/
|
||||||
|
const spdylay_npn_proto* spdylay_npn_get_proto_list(size_t *len_ptr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @function
|
* @function
|
||||||
*
|
*
|
||||||
|
|
|
@ -26,21 +26,22 @@
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
typedef struct {
|
static const spdylay_npn_proto proto_list[] = {
|
||||||
const unsigned char *proto;
|
{ (const unsigned char*)"spdy/3", 6, SPDYLAY_PROTO_SPDY3 },
|
||||||
uint8_t len;
|
{ (const unsigned char*)"spdy/2", 6, SPDYLAY_PROTO_SPDY2 }
|
||||||
uint16_t version;
|
};
|
||||||
} spdylay_npn_proto;
|
|
||||||
|
const spdylay_npn_proto* spdylay_npn_get_proto_list(size_t *len_ptr)
|
||||||
|
{
|
||||||
|
*len_ptr = sizeof(proto_list)/sizeof(spdylay_npn_proto);
|
||||||
|
return proto_list;
|
||||||
|
}
|
||||||
|
|
||||||
int spdylay_select_next_protocol(unsigned char **out, unsigned char *outlen,
|
int spdylay_select_next_protocol(unsigned char **out, unsigned char *outlen,
|
||||||
const unsigned char *in, unsigned int inlen)
|
const unsigned char *in, unsigned int inlen)
|
||||||
{
|
{
|
||||||
int http_selected = 0;
|
int http_selected = 0;
|
||||||
unsigned int i = 0;
|
unsigned int i = 0;
|
||||||
static const spdylay_npn_proto proto_list[] = {
|
|
||||||
{ (const unsigned char*)"spdy/3", 6, SPDYLAY_PROTO_SPDY3 },
|
|
||||||
{ (const unsigned char*)"spdy/2", 6, SPDYLAY_PROTO_SPDY2 }
|
|
||||||
};
|
|
||||||
for(; i < inlen; i += in[i]+1) {
|
for(; i < inlen; i += in[i]+1) {
|
||||||
unsigned int j;
|
unsigned int j;
|
||||||
for(j = 0; j < sizeof(proto_list)/sizeof(spdylay_npn_proto); ++j) {
|
for(j = 0; j < sizeof(proto_list)/sizeof(spdylay_npn_proto); ++j) {
|
||||||
|
|
|
@ -74,6 +74,8 @@ int main(int argc, char* argv[])
|
||||||
!CU_add_test(pSuite, "zlib_spdy2", test_spdylay_zlib_spdy2) ||
|
!CU_add_test(pSuite, "zlib_spdy2", test_spdylay_zlib_spdy2) ||
|
||||||
!CU_add_test(pSuite, "zlib_spdy3", test_spdylay_zlib_spdy3) ||
|
!CU_add_test(pSuite, "zlib_spdy3", test_spdylay_zlib_spdy3) ||
|
||||||
!CU_add_test(pSuite, "npn", test_spdylay_npn) ||
|
!CU_add_test(pSuite, "npn", test_spdylay_npn) ||
|
||||||
|
!CU_add_test(pSuite, "npn_get_proto_list",
|
||||||
|
test_spdylay_npn_get_proto_list) ||
|
||||||
!CU_add_test(pSuite, "session_recv", test_spdylay_session_recv) ||
|
!CU_add_test(pSuite, "session_recv", test_spdylay_session_recv) ||
|
||||||
!CU_add_test(pSuite, "session_recv_invalid_stream_id",
|
!CU_add_test(pSuite, "session_recv_invalid_stream_id",
|
||||||
test_spdylay_session_recv_invalid_stream_id) ||
|
test_spdylay_session_recv_invalid_stream_id) ||
|
||||||
|
|
|
@ -79,3 +79,17 @@ void test_spdylay_npn(void)
|
||||||
http11();
|
http11();
|
||||||
no_overlap();
|
no_overlap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_spdylay_npn_get_proto_list(void)
|
||||||
|
{
|
||||||
|
size_t len;
|
||||||
|
const spdylay_npn_proto *list = spdylay_npn_get_proto_list(&len);
|
||||||
|
CU_ASSERT_EQUAL(2, len);
|
||||||
|
CU_ASSERT_STRING_EQUAL("spdy/3", list[0].proto);
|
||||||
|
CU_ASSERT_EQUAL(6, list[0].len);
|
||||||
|
CU_ASSERT_EQUAL(SPDYLAY_PROTO_SPDY3, list[0].version);
|
||||||
|
|
||||||
|
CU_ASSERT_STRING_EQUAL("spdy/2", list[1].proto);
|
||||||
|
CU_ASSERT_EQUAL(6, list[1].len);
|
||||||
|
CU_ASSERT_EQUAL(SPDYLAY_PROTO_SPDY2, list[1].version);
|
||||||
|
}
|
||||||
|
|
|
@ -26,5 +26,6 @@
|
||||||
#define SPDYLAY_NPN_TEST_H
|
#define SPDYLAY_NPN_TEST_H
|
||||||
|
|
||||||
void test_spdylay_npn(void);
|
void test_spdylay_npn(void);
|
||||||
|
void test_spdylay_npn_get_proto_list(void);
|
||||||
|
|
||||||
#endif /* SPDYLAY_NPN_TEST_H */
|
#endif /* SPDYLAY_NPN_TEST_H */
|
||||||
|
|
Loading…
Reference in New Issue