37 #ifndef CURLPIPE_MULTIPLEX 38 #error "too old libcurl, can't do HTTP/2 server push!" 48 unsigned int width = 0x10;
54 fprintf(stderr,
"%s, %ld bytes (0x%lx)\n",
55 text, (
long)size, (
long)size);
59 fprintf(stderr,
"%4.4lx: ", (
long)i);
63 for(c = 0; c <
width; c++)
65 fprintf(stderr,
"%02x ", ptr[i + c]);
70 for(c = 0; (c <
width) && (i + c < size); c++) {
72 if(nohex && (i + c + 1 < size) && ptr[i + c] == 0x0D &&
73 ptr[i + c + 1] == 0x0A) {
78 (ptr[i + c] >= 0x20) && (ptr[i + c]<0x80)?ptr[i + c]:
'.');
80 if(nohex && (i + c + 2 < size) && ptr[i + c + 1] == 0x0D &&
81 ptr[i + c + 2] == 0x0A) {
100 fprintf(stderr,
"== Info: %s", data);
106 text =
"=> Send header";
109 text =
"=> Send data";
112 text =
"=> Send SSL data";
115 text =
"<= Recv header";
118 text =
"<= Recv data";
121 text =
"<= Recv SSL data";
125 dump(text, (
unsigned char *)data, size, 1);
129 #define OUTPUTFILE "dl" 152 #if (CURLPIPE_MULTIPLEX > 0) 163 struct curl_pushheaders *headers,
168 int *transfers = (
int *)userp;
171 static unsigned int count = 0;
175 snprintf(filename, 128,
"push%u", count++);
178 out = fopen(filename,
"wb");
183 fprintf(stderr,
"**** push callback approves stream %u, got %d headers!\n",
184 count, (
int)num_headers);
186 for(i = 0; i<num_headers; i++) {
188 fprintf(stderr,
"**** header %u: %s\n", (
int)i, headp);
193 fprintf(stderr,
"**** The PATH is %s\n", headp );
240 long curl_timeo = -1;
251 if(curl_timeo >= 0) {
252 timeout.
tv_sec = curl_timeo / 1000;
256 timeout.
tv_usec = (curl_timeo % 1000) * 1000;
263 fprintf(stderr,
"curl_multi_fdset() failed, code %d.\n", mc);
279 struct timeval wait = { 0, 100 * 1000 };
280 rc = select(0, NULL, NULL, NULL, &wait);
286 rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
CURL_EXTERN char * curl_pushheader_bynum(struct curl_pushheaders *h, size_t num)
CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle, fd_set *read_fd_set, fd_set *write_fd_set, fd_set *exc_fd_set, int *max_fd)
CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle, CURL *curl_handle)
CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles)
CURL_EXTERN CURLMcode curl_multi_timeout(CURLM *multi_handle, long *milliseconds)
UNITTEST_START char * ptr
#define curl_easy_setopt(handle, option, value)
CURL_EXTERN CURLM * curl_multi_init(void)
static void setup(CURL *hnd)
CURL_EXTERN char * curl_pushheader_byname(struct curl_pushheaders *h, const char *name)
static CURLM * multi_handle
#define curl_multi_setopt(handle, opt, param)
CURL_EXTERN CURL * curl_easy_init(void)
CURL_EXTERN void curl_easy_cleanup(CURL *curl)
#define CURLPIPE_MULTIPLEX
CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle, CURL *curl_handle)
CURL_EXTERN CURLMsg * curl_multi_info_read(CURLM *multi_handle, int *msgs_in_queue)
static CURL * easy[MAX_EASY_HANDLES]
static void dump(const char *text, unsigned char *ptr, size_t size, char nohex)
static int my_trace(CURL *handle, curl_infotype type, char *data, size_t size, void *userp)
static int server_push_callback(CURL *parent, CURL *easy, size_t num_headers, struct curl_pushheaders *headers, void *userp)
CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle)