@@ -151,11 +151,11 @@
151 151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( g.url.path==0 || g.url.path[0]==0 ){
152 152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zPath = "/";
153 153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
154 154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zPath = g.url.path;
155 155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(pHdr, "%s %s HTTP/1.0\r\n",
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(pHdr, "%s %s HTTP/1.1\r\n",
157 157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nPayload>0 ? "POST" : "GET", zPath);
158 158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.url.proxyAuth ){
159 159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pHdr, "Proxy-Authorization: %s\r\n", g.url.proxyAuth);
160 160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
161 161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.zHttpAuth && g.zHttpAuth[0] ){
@@ -163,10 +163,11 @@
163 163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zEncoded = encode64(zCredentials, -1);
164 164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pHdr, "Authorization: Basic %s\r\n", zEncoded);
165 165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(zEncoded);
166 166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
167 167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pHdr, "Host: %s\r\n", g.url.hostname);
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(pHdr, "Connection: close\r\n");
168 169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pHdr, "User-Agent: %s\r\n", get_user_agent());
169 170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.url.isSsh ) blob_appendf(pHdr, "X-Fossil-Transport: SSH\r\n");
170 171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.syncInfo.fLoginCardMode>0
171 172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& nPayload>0 && pLogin && blob_size(pLogin) ){
172 173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Add sync login card via a transient cookie. We can only do this
@@ -455,10 +456,11 @@
455 456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iHttpVersion; /* Which version of HTTP protocol server uses */
456 457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zLine; /* A single line of the reply header */
457 458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i; /* Loop counter */
458 459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isError = 0; /* True if the reply is an error message */
459 460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isCompressed = 1; /* True if the reply is compressed */
461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isChunked = 0; /* True if Transfer-Encoding: chunked */
460 462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
461 463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.zHttpCmd!=0 ){
462 464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Handle the --transport-command option for "fossil sync" and similar */
463 465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return http_exchange_external(pSend,pReply,mHttpFlags,zAltMimetype);
464 466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -605,10 +607,14 @@
605 607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( iHttpVersion<0 ) iHttpVersion = 1;
606 608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
closeConnection = 0;
607 609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( fossil_strnicmp(zLine, "content-length:", 15)==0 ){
608 610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=15; fossil_isspace(zLine[i]); i++){}
609 611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iLength = atoi(&zLine[i]);
612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( fossil_strnicmp(zLine, "transfer-encoding:", 18)==0 ){
613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3_strlike("%chunked%", &zLine[18], 0)==0 ){
614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ isChunked = 1;
615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
610 616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( fossil_strnicmp(zLine, "connection:", 11)==0 ){
611 617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sqlite3_strlike("%close%", &zLine[11], 0)==0 ){
612 618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
closeConnection = 1;
613 619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( sqlite3_strlike("%keep-alive%", &zLine[11], 0)==0 ){
614 620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
closeConnection = 0;
@@ -735,11 +741,46 @@
735 741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
736 742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
737 743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Extract the reply payload that follows the header
738 744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
739 745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(pReply);
740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( iLength==0 ){
746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( isChunked ){
747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Decode an HTTP/1.1 "Transfer-Encoding: chunked" reply body. Each
748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** chunk is a hex length on its own line (optionally followed by a
749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ";extension" that is ignored), then that many payload bytes, then a
750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** bare CRLF. A zero-length chunk terminates the body, after which any
751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** trailer header lines are read and discarded up to the blank line. */
752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zChunk;
753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( (zChunk = transport_receive_line(&g.url))!=0 ){
754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nChunk; /* Size of this chunk in bytes */
755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nPrior; /* Bytes already in pReply */
756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( fossil_isspace(zChunk[0]) ) zChunk++;
757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nChunk = (int)strtol(zChunk, 0, 16);
758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nChunk<0 ){
759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto write_err;
760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nChunk==0 ){
762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Final chunk: consume trailer lines up to the terminating blank. */
763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( (zChunk = transport_receive_line(&g.url))!=0 && zChunk[0]!=0 ){}
764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nPrior = blob_size(pReply);
767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_resize(pReply, nPrior+nChunk);
768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* transport_receive() may return short; loop until the chunk is full. */
769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( nChunk>0 ){
770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nGot = transport_receive(&g.url, &pReply->aData[nPrior], nChunk);
771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nGot<=0 ){
772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_warning("chunked reply truncated");
773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto write_err;
774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nPrior += nGot;
776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nChunk -= nGot;
777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pReply->nUsed = nPrior;
778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ transport_receive_line(&g.url); /* CRLF that follows the chunk data */
780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( iLength==0 ){
741 782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* No content to read */
742 783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( iLength>0 ){
743 784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Read content of a known length */
744 785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iRecvLen; /* Received length of the reply payload */
745 786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_resize(pReply, iLength);
746 787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!