<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://g2.doxu.org/index.php?action=history&amp;feed=atom&amp;title=Partial_File_Sharing_Protocol</id>
	<title>Partial File Sharing Protocol - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://g2.doxu.org/index.php?action=history&amp;feed=atom&amp;title=Partial_File_Sharing_Protocol"/>
	<link rel="alternate" type="text/html" href="https://g2.doxu.org/index.php?title=Partial_File_Sharing_Protocol&amp;action=history"/>
	<updated>2026-05-05T15:08:19Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>https://g2.doxu.org/index.php?title=Partial_File_Sharing_Protocol&amp;diff=2868&amp;oldid=prev</id>
		<title>Dcat: Reverted edit of ZmkXk2, changed back to last version by Painlord2k</title>
		<link rel="alternate" type="text/html" href="https://g2.doxu.org/index.php?title=Partial_File_Sharing_Protocol&amp;diff=2868&amp;oldid=prev"/>
		<updated>2007-10-21T19:13:37Z</updated>

		<summary type="html">&lt;p&gt;Reverted edit of ZmkXk2, changed back to last version by Painlord2k&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Source - [http://www.the-gdf.org/wiki/index.php?title=Partial_File_Sharing_Protocol]&lt;br /&gt;
&lt;br /&gt;
Partial File Sharing Protocol Version (PFSP) 1.0&amp;lt;br&amp;gt;&lt;br /&gt;
Tor Klingberg &amp;amp;lt;tor.klingberg@gmx.net&amp;amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
August 2002&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Introduction'''&lt;br /&gt;
&lt;br /&gt;
This is a protocol for sharing partial files on the Gnutella network. A&lt;br /&gt;
partial file is a file that a host has only downloaded parts of. Partial &lt;br /&gt;
File Sharing allows files to spread faster over the Gnutella network.&lt;br /&gt;
Here, the server is the host that is providing the file, and client is the&lt;br /&gt;
host that requests the file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Partial File Transfer ==&lt;br /&gt;
&lt;br /&gt;
The server allows HTTP requests for partial files, at URIs chosen by the&lt;br /&gt;
server. They can for example be assigned a file index and shared at&lt;br /&gt;
&amp;quot;/get/index/filename&amp;quot;, or simply at &amp;quot;/partials/filename&amp;quot;. If requests &lt;br /&gt;
by URN are supported, the best way is probably to share only at &lt;br /&gt;
&amp;quot;uri-res/N2R?urn:sha1:HASH_OF_COMPLETE_FILE&amp;quot;. Servers should make sure &lt;br /&gt;
that the URI to a partial file does not become invalid when the file is &lt;br /&gt;
completed.&lt;br /&gt;
&lt;br /&gt;
Only partial requests (with a ''Range'' header) are accepted.&lt;br /&gt;
&lt;br /&gt;
The X-Available-Ranges header is used by the server to inform the client&lt;br /&gt;
about what ranges are available. Note that a 2xx or 503 response without &lt;br /&gt;
an X-Available-Ranges header means the complete file is available. The&lt;br /&gt;
format is as follows:&lt;br /&gt;
&lt;br /&gt;
X-Available-Ranges: bytes 0-10,20-30&lt;br /&gt;
&lt;br /&gt;
The client requests the range it wants using the ''Range'' header.&lt;br /&gt;
&lt;br /&gt;
Range: bytes=0-&lt;br /&gt;
means the client wants any ranges the server can provide.&lt;br /&gt;
&lt;br /&gt;
The server then provides the range it wants to upload using a 206 Partial&lt;br /&gt;
Content response. This allows the server to upload different ranges to&lt;br /&gt;
different hosts, and save bandwidth by allowing them to get the other parts&lt;br /&gt;
from each other. The server can decide to upload any range inside the&lt;br /&gt;
requested range. This means that the client cannot be sure that the first&lt;br /&gt;
byte in the response is first requested byte.&lt;br /&gt;
&lt;br /&gt;
The 206 response contains a Content-Range header on the form&lt;br /&gt;
&lt;br /&gt;
Content-Range: bytes &amp;amp;lt;start&amp;amp;gt;-&amp;amp;lt;end&amp;amp;gt;/&amp;amp;lt;total_size&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that &amp;amp;lt;total_size&amp;amp;gt; is the size of the '''complete''' file.&lt;br /&gt;
&lt;br /&gt;
If the server is unable to provide any part of the requested range, it&lt;br /&gt;
returns a &amp;quot;503 Requested Range Not Available&amp;quot; (the Reason Phrase is just my&lt;br /&gt;
recommendation). If the client continues to request the same range, the&lt;br /&gt;
server may send a 404 to make a PFSP unaware client stop retrying.&lt;br /&gt;
The X-Available-Ranges header will tell a PFSP enabled client what ranges it&lt;br /&gt;
can request.&lt;br /&gt;
&lt;br /&gt;
If the client provides an &amp;quot;Accept:&amp;quot; header with &amp;quot;multipart/byteranges&amp;quot; in&lt;br /&gt;
it, the server may respond with multiple ranges at once. The client may send&lt;br /&gt;
multiple ranges in the Range: header if it sends an ''Accept'' header with&lt;br /&gt;
multipart/byteranges in the same header set. This is standard HTTP/1.1&lt;br /&gt;
stuff, but I doubt that Gnutella servents will support it. If you do not&lt;br /&gt;
want multipart support, just ignore it and everything will work fine.&lt;br /&gt;
&lt;br /&gt;
You should, however, be aware that there can be multiple ranges specified in&lt;br /&gt;
one &amp;quot;Range:&amp;quot; header. Servents are then allowed to choose any range within&lt;br /&gt;
the specified ranges, or simply read the first range only.&lt;br /&gt;
&lt;br /&gt;
== Tree Hashes ==&lt;br /&gt;
&lt;br /&gt;
Tree hashes are not absolutely required for Partial File Sharing, so you&lt;br /&gt;
don't have to implement this part at first. TigerTree can be implemented&lt;br /&gt;
if/when corrupt files become a problem. The reason that it is in this&lt;br /&gt;
document is because Partial File Sharing might cause corrupt files to spread&lt;br /&gt;
faster.&lt;br /&gt;
&lt;br /&gt;
TigerTree hashes are computed using a 1024 byte base size. It is then up to&lt;br /&gt;
each vendor to decide how many sub-hashes to actually store. Storing (and&lt;br /&gt;
advertising) the top 10 levels of the tree might be good decision. It would&lt;br /&gt;
allow a resolution of about 2 MB on a 1 GB file, and requires only about&lt;br /&gt;
25 kB of hash data per file.&lt;br /&gt;
&lt;br /&gt;
The tree is provided as specified in the '''T'''ree '''H'''ash '''EX'''change format ([http://www.open-content.net/specs/draft-jchapweske-thex-01.html THEX]).&lt;br /&gt;
It basically says that the hash tree is provided as a long stream of binary&lt;br /&gt;
data starting with the root hash, then the two hashes it is computed from,&lt;br /&gt;
and so on.&lt;br /&gt;
&lt;br /&gt;
To inform the client about where the hash tree can be retrieved the server&lt;br /&gt;
includes an X-Thex-URI header on this form&lt;br /&gt;
&lt;br /&gt;
X-Thex-URI: &amp;amp;lt;URI&amp;amp;gt; ; &amp;amp;lt;ROOT&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;URI&amp;gt; is any valid URI. It can be to an uri-res translator, and can even&lt;br /&gt;
point to another host. The client can then retrieve desired parts of the&lt;br /&gt;
hash tree by doing range requests for the specified URI.&lt;br /&gt;
&lt;br /&gt;
The THEX data is shared as if it was a partial file. If a client requests a&lt;br /&gt;
subrange of the THEX data that the server does not store, and is not willing&lt;br /&gt;
to calculate on the fly, the server uses the same routines as if it was a&lt;br /&gt;
partial file where the requested range is not available.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lt;ROOT&amp;amp;gt; is the root TigerTree hash in base32 (RFC 3548) encoding.&lt;br /&gt;
&lt;br /&gt;
== How to find the location of partial files ==&lt;br /&gt;
&lt;br /&gt;
This protocol does not affect Gnutella messages in any way. The only&lt;br /&gt;
available mean of spreading the location of a partial file is through the&lt;br /&gt;
download mesh in X-Gnutella-Alternate-Location headers. I think this should&lt;br /&gt;
work very well. Since those who share a partial file are also downloading&lt;br /&gt;
the same file, they will be able to send alt-loc headers to other hosts&lt;br /&gt;
sharing the full file.&lt;br /&gt;
&lt;br /&gt;
Spreading partial files in the download mesh will cause servents that do&lt;br /&gt;
not support partial file sharing to receive addresses to partial sources. I&lt;br /&gt;
don't think that is a problem. The worst thing that can happen is that they&lt;br /&gt;
won't be able to use those sources.&lt;br /&gt;
&lt;br /&gt;
When requesting a file for download, the client must include an alt-loc &lt;br /&gt;
header pointing to its locally shared partial file, if there is not a good &lt;br /&gt;
reason not to do so in the particular case. If the client is firewalled&lt;br /&gt;
(and push proxy URIs are not available) that is a reason. Clients should &lt;br /&gt;
do this even if the download has not started yet. Since it takes a while &lt;br /&gt;
for alt-locs to spread, the download is likely to have started when &lt;br /&gt;
someone else get the alt-loc. If not, a few failed download requests is &lt;br /&gt;
not a big problem.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sample negotiation ==&lt;br /&gt;
&lt;br /&gt;
Here is a sample negotiation. I don't think it will look exactly like this,&lt;br /&gt;
but it should show the headers in action. Clients might want to request a&lt;br /&gt;
small range first, to get the list of available ranges. There are some&lt;br /&gt;
linebreakes in long headers below.&lt;br /&gt;
&lt;br /&gt;
Client:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET /uri-res/N2R?urn:sha1:QLFYWY2RI5WZCTEP6MJKR5CAFGP7FQ5X HTTP/1.1&lt;br /&gt;
User-Agent: FooBar/1.0&lt;br /&gt;
Host: 192.0.2.65:6346&lt;br /&gt;
Connection: Keep-Alive&lt;br /&gt;
Range: bytes=73826-&lt;br /&gt;
X-Gnutella-Content-URN: urn:sha1:QLFYWY2RI5WZCTEP6MJKR5CAFGP7FQ5X&lt;br /&gt;
X-Alt: 192.0.2.99:6348, 192.0.2.199, 192.0.2.14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Server:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HTTP/1.1 206 Partial Content&lt;br /&gt;
Server: FooBar/1.0&lt;br /&gt;
Content-Type: audio/mpeg&lt;br /&gt;
Content-Range: bytes 73826-285749/533273&lt;br /&gt;
Content-Length: 211924&lt;br /&gt;
Connection: Keep-Alive&lt;br /&gt;
X-Available-Ranges: bytes 0-285749,425926-488271&lt;br /&gt;
X-Gnutella-Content-URN: urn:sha1:QLFYWY2RI5WZCTEP6MJKR5CAFGP7FQ5X&lt;br /&gt;
X-Thex-URI: &lt;br /&gt;
  /uri-res/N2X?urn:sha1:QLFYWY2RI5WZCTEP6MJKR5CAFGP7FQ5X;VEKXTRSJPTZJLY2IKG5FQ2TCXK26SECFPP4DX7I&lt;br /&gt;
X-Gnutella-Alternate-Location: &amp;amp;lt;list of alt-locs&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;amp;lt;211924 bytes of data&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;N2X&amp;quot; above is an example. Someone should comment on what should be used.&lt;br /&gt;
Since the URI is provided in the X-Thex-URI header, each vendor can chose&lt;br /&gt;
how to provide the THEX data.&lt;/div&gt;</summary>
		<author><name>Dcat</name></author>
	</entry>
	<entry>
		<id>https://g2.doxu.org/index.php?title=Partial_File_Sharing_Protocol&amp;diff=1903&amp;oldid=prev</id>
		<title>Painlord2k at 18:09, 7 September 2005</title>
		<link rel="alternate" type="text/html" href="https://g2.doxu.org/index.php?title=Partial_File_Sharing_Protocol&amp;diff=1903&amp;oldid=prev"/>
		<updated>2005-09-07T18:09:53Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Source - [http://www.the-gdf.org/wiki/index.php?title=Partial_File_Sharing_Protocol]&lt;br /&gt;
&lt;br /&gt;
Partial File Sharing Protocol Version (PFSP) 1.0&amp;lt;br&amp;gt;&lt;br /&gt;
Tor Klingberg &amp;amp;lt;tor.klingberg@gmx.net&amp;amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
August 2002&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Introduction'''&lt;br /&gt;
&lt;br /&gt;
This is a protocol for sharing partial files on the Gnutella network. A&lt;br /&gt;
partial file is a file that a host has only downloaded parts of. Partial &lt;br /&gt;
File Sharing allows files to spread faster over the Gnutella network.&lt;br /&gt;
Here, the server is the host that is providing the file, and client is the&lt;br /&gt;
host that requests the file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Partial File Transfer ==&lt;br /&gt;
&lt;br /&gt;
The server allows HTTP requests for partial files, at URIs chosen by the&lt;br /&gt;
server. They can for example be assigned a file index and shared at&lt;br /&gt;
&amp;quot;/get/index/filename&amp;quot;, or simply at &amp;quot;/partials/filename&amp;quot;. If requests &lt;br /&gt;
by URN are supported, the best way is probably to share only at &lt;br /&gt;
&amp;quot;uri-res/N2R?urn:sha1:HASH_OF_COMPLETE_FILE&amp;quot;. Servers should make sure &lt;br /&gt;
that the URI to a partial file does not become invalid when the file is &lt;br /&gt;
completed.&lt;br /&gt;
&lt;br /&gt;
Only partial requests (with a ''Range'' header) are accepted.&lt;br /&gt;
&lt;br /&gt;
The X-Available-Ranges header is used by the server to inform the client&lt;br /&gt;
about what ranges are available. Note that a 2xx or 503 response without &lt;br /&gt;
an X-Available-Ranges header means the complete file is available. The&lt;br /&gt;
format is as follows:&lt;br /&gt;
&lt;br /&gt;
X-Available-Ranges: bytes 0-10,20-30&lt;br /&gt;
&lt;br /&gt;
The client requests the range it wants using the ''Range'' header.&lt;br /&gt;
&lt;br /&gt;
Range: bytes=0-&lt;br /&gt;
means the client wants any ranges the server can provide.&lt;br /&gt;
&lt;br /&gt;
The server then provides the range it wants to upload using a 206 Partial&lt;br /&gt;
Content response. This allows the server to upload different ranges to&lt;br /&gt;
different hosts, and save bandwidth by allowing them to get the other parts&lt;br /&gt;
from each other. The server can decide to upload any range inside the&lt;br /&gt;
requested range. This means that the client cannot be sure that the first&lt;br /&gt;
byte in the response is first requested byte.&lt;br /&gt;
&lt;br /&gt;
The 206 response contains a Content-Range header on the form&lt;br /&gt;
&lt;br /&gt;
Content-Range: bytes &amp;amp;lt;start&amp;amp;gt;-&amp;amp;lt;end&amp;amp;gt;/&amp;amp;lt;total_size&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that &amp;amp;lt;total_size&amp;amp;gt; is the size of the '''complete''' file.&lt;br /&gt;
&lt;br /&gt;
If the server is unable to provide any part of the requested range, it&lt;br /&gt;
returns a &amp;quot;503 Requested Range Not Available&amp;quot; (the Reason Phrase is just my&lt;br /&gt;
recommendation). If the client continues to request the same range, the&lt;br /&gt;
server may send a 404 to make a PFSP unaware client stop retrying.&lt;br /&gt;
The X-Available-Ranges header will tell a PFSP enabled client what ranges it&lt;br /&gt;
can request.&lt;br /&gt;
&lt;br /&gt;
If the client provides an &amp;quot;Accept:&amp;quot; header with &amp;quot;multipart/byteranges&amp;quot; in&lt;br /&gt;
it, the server may respond with multiple ranges at once. The client may send&lt;br /&gt;
multiple ranges in the Range: header if it sends an ''Accept'' header with&lt;br /&gt;
multipart/byteranges in the same header set. This is standard HTTP/1.1&lt;br /&gt;
stuff, but I doubt that Gnutella servents will support it. If you do not&lt;br /&gt;
want multipart support, just ignore it and everything will work fine.&lt;br /&gt;
&lt;br /&gt;
You should, however, be aware that there can be multiple ranges specified in&lt;br /&gt;
one &amp;quot;Range:&amp;quot; header. Servents are then allowed to choose any range within&lt;br /&gt;
the specified ranges, or simply read the first range only.&lt;br /&gt;
&lt;br /&gt;
== Tree Hashes ==&lt;br /&gt;
&lt;br /&gt;
Tree hashes are not absolutely required for Partial File Sharing, so you&lt;br /&gt;
don't have to implement this part at first. TigerTree can be implemented&lt;br /&gt;
if/when corrupt files become a problem. The reason that it is in this&lt;br /&gt;
document is because Partial File Sharing might cause corrupt files to spread&lt;br /&gt;
faster.&lt;br /&gt;
&lt;br /&gt;
TigerTree hashes are computed using a 1024 byte base size. It is then up to&lt;br /&gt;
each vendor to decide how many sub-hashes to actually store. Storing (and&lt;br /&gt;
advertising) the top 10 levels of the tree might be good decision. It would&lt;br /&gt;
allow a resolution of about 2 MB on a 1 GB file, and requires only about&lt;br /&gt;
25 kB of hash data per file.&lt;br /&gt;
&lt;br /&gt;
The tree is provided as specified in the '''T'''ree '''H'''ash '''EX'''change format ([http://www.open-content.net/specs/draft-jchapweske-thex-01.html THEX]).&lt;br /&gt;
It basically says that the hash tree is provided as a long stream of binary&lt;br /&gt;
data starting with the root hash, then the two hashes it is computed from,&lt;br /&gt;
and so on.&lt;br /&gt;
&lt;br /&gt;
To inform the client about where the hash tree can be retrieved the server&lt;br /&gt;
includes an X-Thex-URI header on this form&lt;br /&gt;
&lt;br /&gt;
X-Thex-URI: &amp;amp;lt;URI&amp;amp;gt; ; &amp;amp;lt;ROOT&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;URI&amp;gt; is any valid URI. It can be to an uri-res translator, and can even&lt;br /&gt;
point to another host. The client can then retrieve desired parts of the&lt;br /&gt;
hash tree by doing range requests for the specified URI.&lt;br /&gt;
&lt;br /&gt;
The THEX data is shared as if it was a partial file. If a client requests a&lt;br /&gt;
subrange of the THEX data that the server does not store, and is not willing&lt;br /&gt;
to calculate on the fly, the server uses the same routines as if it was a&lt;br /&gt;
partial file where the requested range is not available.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lt;ROOT&amp;amp;gt; is the root TigerTree hash in base32 (RFC 3548) encoding.&lt;br /&gt;
&lt;br /&gt;
== How to find the location of partial files ==&lt;br /&gt;
&lt;br /&gt;
This protocol does not affect Gnutella messages in any way. The only&lt;br /&gt;
available mean of spreading the location of a partial file is through the&lt;br /&gt;
download mesh in X-Gnutella-Alternate-Location headers. I think this should&lt;br /&gt;
work very well. Since those who share a partial file are also downloading&lt;br /&gt;
the same file, they will be able to send alt-loc headers to other hosts&lt;br /&gt;
sharing the full file.&lt;br /&gt;
&lt;br /&gt;
Spreading partial files in the download mesh will cause servents that do&lt;br /&gt;
not support partial file sharing to receive addresses to partial sources. I&lt;br /&gt;
don't think that is a problem. The worst thing that can happen is that they&lt;br /&gt;
won't be able to use those sources.&lt;br /&gt;
&lt;br /&gt;
When requesting a file for download, the client must include an alt-loc &lt;br /&gt;
header pointing to its locally shared partial file, if there is not a good &lt;br /&gt;
reason not to do so in the particular case. If the client is firewalled&lt;br /&gt;
(and push proxy URIs are not available) that is a reason. Clients should &lt;br /&gt;
do this even if the download has not started yet. Since it takes a while &lt;br /&gt;
for alt-locs to spread, the download is likely to have started when &lt;br /&gt;
someone else get the alt-loc. If not, a few failed download requests is &lt;br /&gt;
not a big problem.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sample negotiation ==&lt;br /&gt;
&lt;br /&gt;
Here is a sample negotiation. I don't think it will look exactly like this,&lt;br /&gt;
but it should show the headers in action. Clients might want to request a&lt;br /&gt;
small range first, to get the list of available ranges. There are some&lt;br /&gt;
linebreakes in long headers below.&lt;br /&gt;
&lt;br /&gt;
Client:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET /uri-res/N2R?urn:sha1:QLFYWY2RI5WZCTEP6MJKR5CAFGP7FQ5X HTTP/1.1&lt;br /&gt;
User-Agent: FooBar/1.0&lt;br /&gt;
Host: 192.0.2.65:6346&lt;br /&gt;
Connection: Keep-Alive&lt;br /&gt;
Range: bytes=73826-&lt;br /&gt;
X-Gnutella-Content-URN: urn:sha1:QLFYWY2RI5WZCTEP6MJKR5CAFGP7FQ5X&lt;br /&gt;
X-Alt: 192.0.2.99:6348, 192.0.2.199, 192.0.2.14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Server:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HTTP/1.1 206 Partial Content&lt;br /&gt;
Server: FooBar/1.0&lt;br /&gt;
Content-Type: audio/mpeg&lt;br /&gt;
Content-Range: bytes 73826-285749/533273&lt;br /&gt;
Content-Length: 211924&lt;br /&gt;
Connection: Keep-Alive&lt;br /&gt;
X-Available-Ranges: bytes 0-285749,425926-488271&lt;br /&gt;
X-Gnutella-Content-URN: urn:sha1:QLFYWY2RI5WZCTEP6MJKR5CAFGP7FQ5X&lt;br /&gt;
X-Thex-URI: &lt;br /&gt;
  /uri-res/N2X?urn:sha1:QLFYWY2RI5WZCTEP6MJKR5CAFGP7FQ5X;VEKXTRSJPTZJLY2IKG5FQ2TCXK26SECFPP4DX7I&lt;br /&gt;
X-Gnutella-Alternate-Location: &amp;amp;lt;list of alt-locs&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;amp;lt;211924 bytes of data&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;N2X&amp;quot; above is an example. Someone should comment on what should be used.&lt;br /&gt;
Since the URI is provided in the X-Thex-URI header, each vendor can chose&lt;br /&gt;
how to provide the THEX data.&lt;/div&gt;</summary>
		<author><name>Painlord2k</name></author>
	</entry>
</feed>