- fix maximum write count for LWIP_HTTPD_DYNAMIC_FILE_READ==1 (was limited to 2*mss);
- fix waiting for ACK from remote side after sending headers of async read files;
- pass TCP_WRITE_FLAG_MORE when writing headers
This commit is contained in:
goldsimon 2014-12-17 10:18:13 +01:00
parent b9705ef949
commit 4023aedb3a
1 changed files with 31 additions and 7 deletions

View File

@ -401,6 +401,7 @@ static err_t http_close_or_abort_conn(struct tcp_pcb *pcb, struct http_state *hs
static err_t http_find_file(struct http_state *hs, const char *uri, int is_09);
static err_t http_init_file(struct http_state *hs, struct fs_file *file, int is_09, const char *uri, u8_t tag_check);
static err_t http_poll(void *arg, struct tcp_pcb *pcb);
static u8_t http_check_eof(struct tcp_pcb *pcb, struct http_state *hs);
#if LWIP_HTTPD_FS_ASYNC_READ
static void http_continue(void *connection);
#endif /* LWIP_HTTPD_FS_ASYNC_READ */
@ -1011,6 +1012,7 @@ http_send_headers(struct tcp_pcb *pcb, struct http_state *hs)
while(len && (hs->hdr_index < NUM_FILE_HDR_STRINGS) && sendlen) {
const void *ptr;
u16_t old_sendlen;
u8_t apiflags;
/* How much do we have to send from the current header? */
hdrlen = (u16_t)strlen(hs->hdrs[hs->hdr_index]);
@ -1018,10 +1020,14 @@ http_send_headers(struct tcp_pcb *pcb, struct http_state *hs)
sendlen = (len < (hdrlen - hs->hdr_pos)) ? len : (hdrlen - hs->hdr_pos);
/* Send this amount of data or as much as we can given memory
* constraints. */
* constraints. */
ptr = (const void *)(hs->hdrs[hs->hdr_index] + hs->hdr_pos);
old_sendlen = sendlen;
err = http_write(pcb, ptr, &sendlen, HTTP_IS_HDR_VOLATILE(hs, ptr));
apiflags = HTTP_IS_HDR_VOLATILE(hs, ptr);
if (hs->hdr_index < NUM_FILE_HDR_STRINGS - 1) {
apiflags |= TCP_WRITE_FLAG_MORE;
}
err = http_write(pcb, ptr, &sendlen, apiflags);
if ((err == ERR_OK) && (old_sendlen != sendlen)) {
/* Remember that we added some more data to be transmitted. */
data_to_send = HTTP_DATA_TO_SEND_CONTINUE;
@ -1041,6 +1047,13 @@ http_send_headers(struct tcp_pcb *pcb, struct http_state *hs)
hs->hdr_pos = 0;
}
}
if ((hs->hdr_index >= NUM_FILE_HDR_STRINGS) && (hs->file == NULL)) {
/* When we are at the end of the headers, check for data to send
* instead of waiting for ACK from remote side to continue
* (which would happen when sending files from async read). */
http_check_eof(pcb, hs);
}
/* If we get here and there are still header bytes to send, we send
* the header information we just wrote immediately. If there are no
* more headers to send, but we do have file data to send, drop through
@ -1062,8 +1075,12 @@ http_send_headers(struct tcp_pcb *pcb, struct http_state *hs)
static u8_t
http_check_eof(struct tcp_pcb *pcb, struct http_state *hs)
{
int bytes_left;
#if LWIP_HTTPD_DYNAMIC_FILE_READ
int count;
#ifdef HTTPD_MAX_WRITE_LEN
int max_write_len;
#endif /* HTTPD_MAX_WRITE_LEN */
#endif /* LWIP_HTTPD_DYNAMIC_FILE_READ */
/* Do we have a valid file handle? */
@ -1072,7 +1089,8 @@ http_check_eof(struct tcp_pcb *pcb, struct http_state *hs)
http_eof(pcb, hs);
return 0;
}
if (fs_bytes_left(hs->handle) <= 0) {
bytes_left = fs_bytes_left(hs->handle);
if (bytes_left <= 0) {
/* We reached the end of the file so this request is done. */
LWIP_DEBUGF(HTTPD_DEBUG, ("End of file.\n"));
http_eof(pcb, hs);
@ -1084,11 +1102,17 @@ http_check_eof(struct tcp_pcb *pcb, struct http_state *hs)
/* Yes - get the length of the buffer */
count = hs->buf_len;
} else {
/* We don't have a send buffer so allocate one up to 2mss bytes long. */
/* We don't have a send buffer so allocate one now */
count = tcp_sndbuf(pcb);
if(bytes_left < count) {
count = bytes_left;
}
#ifdef HTTPD_MAX_WRITE_LEN
count = HTTPD_MAX_WRITE_LEN(pcb);
#else /* HTTPD_MAX_WRITE_LEN */
count = 2 * tcp_mss(pcb);
/* Additional limitation: e.g. don't enqueue more than 2*mss at once */
max_write_len = HTTPD_MAX_WRITE_LEN(pcb);
if (count > max_write_len) {
count = max_write_len;
}
#endif /* HTTPD_MAX_WRITE_LEN */
do {
hs->buf = (char*)mem_malloc((mem_size_t)count);