Revision 9:37719e88568d

b/Assets/Plugins/UnityHTTP.meta
1
fileFormatVersion: 2
2
guid: 512b1983a304140809456c78f4e3b1b7
3
folderAsset: yes
4
DefaultImporter:
5
  userData: 
b/Assets/Plugins/UnityHTTP/.git/HEAD
1
ref: refs/heads/master
b/Assets/Plugins/UnityHTTP/.git/config
1
[core]
2
	repositoryformatversion = 0
3
	filemode = true
4
	bare = false
5
	logallrefupdates = true
6
	ignorecase = true
7
	precomposeunicode = true
8
[remote "origin"]
9
	url = https://github.com/andyburke/UnityHTTP.git
10
	fetch = +refs/heads/*:refs/remotes/origin/*
11
[branch "master"]
12
	remote = origin
13
	merge = refs/heads/master
b/Assets/Plugins/UnityHTTP/.git/description
1
Unnamed repository; edit this file 'description' to name the repository.
b/Assets/Plugins/UnityHTTP/.git/hooks/applypatch-msg.sample
1
#!/bin/sh
2
#
3
# An example hook script to check the commit log message taken by
4
# applypatch from an e-mail message.
5
#
6
# The hook should exit with non-zero status after issuing an
7
# appropriate message if it wants to stop the commit.  The hook is
8
# allowed to edit the commit message file.
9
#
10
# To enable this hook, rename this file to "applypatch-msg".
11

  
12
. git-sh-setup
13
test -x "$GIT_DIR/hooks/commit-msg" &&
14
	exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"}
15
:
b/Assets/Plugins/UnityHTTP/.git/hooks/commit-msg.sample
1
#!/bin/sh
2
#
3
# An example hook script to check the commit log message.
4
# Called by "git commit" with one argument, the name of the file
5
# that has the commit message.  The hook should exit with non-zero
6
# status after issuing an appropriate message if it wants to stop the
7
# commit.  The hook is allowed to edit the commit message file.
8
#
9
# To enable this hook, rename this file to "commit-msg".
10

  
11
# Uncomment the below to add a Signed-off-by line to the message.
12
# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
13
# hook is more suited to it.
14
#
15
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
16
# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
17

  
18
# This example catches duplicate Signed-off-by lines.
19

  
20
test "" = "$(grep '^Signed-off-by: ' "$1" |
21
	 sort | uniq -c | sed -e '/^[ 	]*1[ 	]/d')" || {
22
	echo >&2 Duplicate Signed-off-by lines.
23
	exit 1
24
}
b/Assets/Plugins/UnityHTTP/.git/hooks/post-update.sample
1
#!/bin/sh
2
#
3
# An example hook script to prepare a packed repository for use over
4
# dumb transports.
5
#
6
# To enable this hook, rename this file to "post-update".
7

  
8
exec git update-server-info
b/Assets/Plugins/UnityHTTP/.git/hooks/pre-applypatch.sample
1
#!/bin/sh
2
#
3
# An example hook script to verify what is about to be committed
4
# by applypatch from an e-mail message.
5
#
6
# The hook should exit with non-zero status after issuing an
7
# appropriate message if it wants to stop the commit.
8
#
9
# To enable this hook, rename this file to "pre-applypatch".
10

  
11
. git-sh-setup
12
test -x "$GIT_DIR/hooks/pre-commit" &&
13
	exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"}
14
:
b/Assets/Plugins/UnityHTTP/.git/hooks/pre-commit.sample
1
#!/bin/sh
2
#
3
# An example hook script to verify what is about to be committed.
4
# Called by "git commit" with no arguments.  The hook should
5
# exit with non-zero status after issuing an appropriate message if
6
# it wants to stop the commit.
7
#
8
# To enable this hook, rename this file to "pre-commit".
9

  
10
if git rev-parse --verify HEAD >/dev/null 2>&1
11
then
12
	against=HEAD
13
else
14
	# Initial commit: diff against an empty tree object
15
	against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
16
fi
17

  
18
# If you want to allow non-ASCII filenames set this variable to true.
19
allownonascii=$(git config --bool hooks.allownonascii)
20

  
21
# Redirect output to stderr.
22
exec 1>&2
23

  
24
# Cross platform projects tend to avoid non-ASCII filenames; prevent
25
# them from being added to the repository. We exploit the fact that the
26
# printable range starts at the space character and ends with tilde.
27
if [ "$allownonascii" != "true" ] &&
28
	# Note that the use of brackets around a tr range is ok here, (it's
29
	# even required, for portability to Solaris 10's /usr/bin/tr), since
30
	# the square bracket bytes happen to fall in the designated range.
31
	test $(git diff --cached --name-only --diff-filter=A -z $against |
32
	  LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
33
then
34
	cat <<\EOF
35
Error: Attempt to add a non-ASCII file name.
36

  
37
This can cause problems if you want to work with people on other platforms.
38

  
39
To be portable it is advisable to rename the file.
40

  
41
If you know what you are doing you can disable this check using:
42

  
43
  git config hooks.allownonascii true
44
EOF
45
	exit 1
46
fi
47

  
48
# If there are whitespace errors, print the offending file names and fail.
49
exec git diff-index --check --cached $against --
b/Assets/Plugins/UnityHTTP/.git/hooks/pre-push.sample
1
#!/bin/sh
2

  
3
# An example hook script to verify what is about to be pushed.  Called by "git
4
# push" after it has checked the remote status, but before anything has been
5
# pushed.  If this script exits with a non-zero status nothing will be pushed.
6
#
7
# This hook is called with the following parameters:
8
#
9
# $1 -- Name of the remote to which the push is being done
10
# $2 -- URL to which the push is being done
11
#
12
# If pushing without using a named remote those arguments will be equal.
13
#
14
# Information about the commits which are being pushed is supplied as lines to
15
# the standard input in the form:
16
#
17
#   <local ref> <local sha1> <remote ref> <remote sha1>
18
#
19
# This sample shows how to prevent push of commits where the log message starts
20
# with "WIP" (work in progress).
21

  
22
remote="$1"
23
url="$2"
24

  
25
z40=0000000000000000000000000000000000000000
26

  
27
IFS=' '
28
while read local_ref local_sha remote_ref remote_sha
29
do
30
	if [ "$local_sha" = $z40 ]
31
	then
32
		# Handle delete
33
		:
34
	else
35
		if [ "$remote_sha" = $z40 ]
36
		then
37
			# New branch, examine all commits
38
			range="$local_sha"
39
		else
40
			# Update to existing branch, examine new commits
41
			range="$remote_sha..$local_sha"
42
		fi
43

  
44
		# Check for WIP commit
45
		commit=`git rev-list -n 1 --grep '^WIP' "$range"`
46
		if [ -n "$commit" ]
47
		then
48
			echo "Found WIP commit in $local_ref, not pushing"
49
			exit 1
50
		fi
51
	fi
52
done
53

  
54
exit 0
b/Assets/Plugins/UnityHTTP/.git/hooks/pre-rebase.sample
1
#!/bin/sh
2
#
3
# Copyright (c) 2006, 2008 Junio C Hamano
4
#
5
# The "pre-rebase" hook is run just before "git rebase" starts doing
6
# its job, and can prevent the command from running by exiting with
7
# non-zero status.
8
#
9
# The hook is called with the following parameters:
10
#
11
# $1 -- the upstream the series was forked from.
12
# $2 -- the branch being rebased (or empty when rebasing the current branch).
13
#
14
# This sample shows how to prevent topic branches that are already
15
# merged to 'next' branch from getting rebased, because allowing it
16
# would result in rebasing already published history.
17

  
18
publish=next
19
basebranch="$1"
20
if test "$#" = 2
21
then
22
	topic="refs/heads/$2"
23
else
24
	topic=`git symbolic-ref HEAD` ||
25
	exit 0 ;# we do not interrupt rebasing detached HEAD
26
fi
27

  
28
case "$topic" in
29
refs/heads/??/*)
30
	;;
31
*)
32
	exit 0 ;# we do not interrupt others.
33
	;;
34
esac
35

  
36
# Now we are dealing with a topic branch being rebased
37
# on top of master.  Is it OK to rebase it?
38

  
39
# Does the topic really exist?
40
git show-ref -q "$topic" || {
41
	echo >&2 "No such branch $topic"
42
	exit 1
43
}
44

  
45
# Is topic fully merged to master?
46
not_in_master=`git rev-list --pretty=oneline ^master "$topic"`
47
if test -z "$not_in_master"
48
then
49
	echo >&2 "$topic is fully merged to master; better remove it."
50
	exit 1 ;# we could allow it, but there is no point.
51
fi
52

  
53
# Is topic ever merged to next?  If so you should not be rebasing it.
54
only_next_1=`git rev-list ^master "^$topic" ${publish} | sort`
55
only_next_2=`git rev-list ^master           ${publish} | sort`
56
if test "$only_next_1" = "$only_next_2"
57
then
58
	not_in_topic=`git rev-list "^$topic" master`
59
	if test -z "$not_in_topic"
60
	then
61
		echo >&2 "$topic is already up-to-date with master"
62
		exit 1 ;# we could allow it, but there is no point.
63
	else
64
		exit 0
65
	fi
66
else
67
	not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"`
68
	/usr/bin/perl -e '
69
		my $topic = $ARGV[0];
70
		my $msg = "* $topic has commits already merged to public branch:\n";
71
		my (%not_in_next) = map {
72
			/^([0-9a-f]+) /;
73
			($1 => 1);
74
		} split(/\n/, $ARGV[1]);
75
		for my $elem (map {
76
				/^([0-9a-f]+) (.*)$/;
77
				[$1 => $2];
78
			} split(/\n/, $ARGV[2])) {
79
			if (!exists $not_in_next{$elem->[0]}) {
80
				if ($msg) {
81
					print STDERR $msg;
82
					undef $msg;
83
				}
84
				print STDERR " $elem->[1]\n";
85
			}
86
		}
87
	' "$topic" "$not_in_next" "$not_in_master"
88
	exit 1
89
fi
90

  
91
exit 0
92

  
93
################################################################
94

  
95
This sample hook safeguards topic branches that have been
96
published from being rewound.
97

  
98
The workflow assumed here is:
99

  
100
 * Once a topic branch forks from "master", "master" is never
101
   merged into it again (either directly or indirectly).
102

  
103
 * Once a topic branch is fully cooked and merged into "master",
104
   it is deleted.  If you need to build on top of it to correct
105
   earlier mistakes, a new topic branch is created by forking at
106
   the tip of the "master".  This is not strictly necessary, but
107
   it makes it easier to keep your history simple.
108

  
109
 * Whenever you need to test or publish your changes to topic
110
   branches, merge them into "next" branch.
111

  
112
The script, being an example, hardcodes the publish branch name
113
to be "next", but it is trivial to make it configurable via
114
$GIT_DIR/config mechanism.
115

  
116
With this workflow, you would want to know:
117

  
118
(1) ... if a topic branch has ever been merged to "next".  Young
119
    topic branches can have stupid mistakes you would rather
120
    clean up before publishing, and things that have not been
121
    merged into other branches can be easily rebased without
122
    affecting other people.  But once it is published, you would
123
    not want to rewind it.
124

  
125
(2) ... if a topic branch has been fully merged to "master".
126
    Then you can delete it.  More importantly, you should not
127
    build on top of it -- other people may already want to
128
    change things related to the topic as patches against your
129
    "master", so if you need further changes, it is better to
130
    fork the topic (perhaps with the same name) afresh from the
131
    tip of "master".
132

  
133
Let's look at this example:
134

  
135
		   o---o---o---o---o---o---o---o---o---o "next"
136
		  /       /           /           /
137
		 /   a---a---b A     /           /
138
		/   /               /           /
139
	       /   /   c---c---c---c B         /
140
	      /   /   /             \         /
141
	     /   /   /   b---b C     \       /
142
	    /   /   /   /             \     /
143
    ---o---o---o---o---o---o---o---o---o---o---o "master"
144

  
145

  
146
A, B and C are topic branches.
147

  
148
 * A has one fix since it was merged up to "next".
149

  
150
 * B has finished.  It has been fully merged up to "master" and "next",
151
   and is ready to be deleted.
152

  
153
 * C has not merged to "next" at all.
154

  
155
We would want to allow C to be rebased, refuse A, and encourage
156
B to be deleted.
157

  
158
To compute (1):
159

  
160
	git rev-list ^master ^topic next
161
	git rev-list ^master        next
162

  
163
	if these match, topic has not merged in next at all.
164

  
165
To compute (2):
166

  
167
	git rev-list master..topic
168

  
169
	if this is empty, it is fully merged to "master".
b/Assets/Plugins/UnityHTTP/.git/hooks/prepare-commit-msg.sample
1
#!/bin/sh
2
#
3
# An example hook script to prepare the commit log message.
4
# Called by "git commit" with the name of the file that has the
5
# commit message, followed by the description of the commit
6
# message's source.  The hook's purpose is to edit the commit
7
# message file.  If the hook fails with a non-zero status,
8
# the commit is aborted.
9
#
10
# To enable this hook, rename this file to "prepare-commit-msg".
11

  
12
# This hook includes three examples.  The first comments out the
13
# "Conflicts:" part of a merge commit.
14
#
15
# The second includes the output of "git diff --name-status -r"
16
# into the message, just before the "git status" output.  It is
17
# commented because it doesn't cope with --amend or with squashed
18
# commits.
19
#
20
# The third example adds a Signed-off-by line to the message, that can
21
# still be edited.  This is rarely a good idea.
22

  
23
case "$2,$3" in
24
  merge,)
25
    /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;;
26

  
27
# ,|template,)
28
#   /usr/bin/perl -i.bak -pe '
29
#      print "\n" . `git diff --cached --name-status -r`
30
#	 if /^#/ && $first++ == 0' "$1" ;;
31

  
32
  *) ;;
33
esac
34

  
35
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
36
# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
b/Assets/Plugins/UnityHTTP/.git/hooks/update.sample
1
#!/bin/sh
2
#
3
# An example hook script to blocks unannotated tags from entering.
4
# Called by "git receive-pack" with arguments: refname sha1-old sha1-new
5
#
6
# To enable this hook, rename this file to "update".
7
#
8
# Config
9
# ------
10
# hooks.allowunannotated
11
#   This boolean sets whether unannotated tags will be allowed into the
12
#   repository.  By default they won't be.
13
# hooks.allowdeletetag
14
#   This boolean sets whether deleting tags will be allowed in the
15
#   repository.  By default they won't be.
16
# hooks.allowmodifytag
17
#   This boolean sets whether a tag may be modified after creation. By default
18
#   it won't be.
19
# hooks.allowdeletebranch
20
#   This boolean sets whether deleting branches will be allowed in the
21
#   repository.  By default they won't be.
22
# hooks.denycreatebranch
23
#   This boolean sets whether remotely creating branches will be denied
24
#   in the repository.  By default this is allowed.
25
#
26

  
27
# --- Command line
28
refname="$1"
29
oldrev="$2"
30
newrev="$3"
31

  
32
# --- Safety check
33
if [ -z "$GIT_DIR" ]; then
34
	echo "Don't run this script from the command line." >&2
35
	echo " (if you want, you could supply GIT_DIR then run" >&2
36
	echo "  $0 <ref> <oldrev> <newrev>)" >&2
37
	exit 1
38
fi
39

  
40
if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
41
	echo "usage: $0 <ref> <oldrev> <newrev>" >&2
42
	exit 1
43
fi
44

  
45
# --- Config
46
allowunannotated=$(git config --bool hooks.allowunannotated)
47
allowdeletebranch=$(git config --bool hooks.allowdeletebranch)
48
denycreatebranch=$(git config --bool hooks.denycreatebranch)
49
allowdeletetag=$(git config --bool hooks.allowdeletetag)
50
allowmodifytag=$(git config --bool hooks.allowmodifytag)
51

  
52
# check for no description
53
projectdesc=$(sed -e '1q' "$GIT_DIR/description")
54
case "$projectdesc" in
55
"Unnamed repository"* | "")
56
	echo "*** Project description file hasn't been set" >&2
57
	exit 1
58
	;;
59
esac
60

  
61
# --- Check types
62
# if $newrev is 0000...0000, it's a commit to delete a ref.
63
zero="0000000000000000000000000000000000000000"
64
if [ "$newrev" = "$zero" ]; then
65
	newrev_type=delete
66
else
67
	newrev_type=$(git cat-file -t $newrev)
68
fi
69

  
70
case "$refname","$newrev_type" in
71
	refs/tags/*,commit)
72
		# un-annotated tag
73
		short_refname=${refname##refs/tags/}
74
		if [ "$allowunannotated" != "true" ]; then
75
			echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2
76
			echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
77
			exit 1
78
		fi
79
		;;
80
	refs/tags/*,delete)
81
		# delete tag
82
		if [ "$allowdeletetag" != "true" ]; then
83
			echo "*** Deleting a tag is not allowed in this repository" >&2
84
			exit 1
85
		fi
86
		;;
87
	refs/tags/*,tag)
88
		# annotated tag
89
		if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1
90
		then
91
			echo "*** Tag '$refname' already exists." >&2
92
			echo "*** Modifying a tag is not allowed in this repository." >&2
93
			exit 1
94
		fi
95
		;;
96
	refs/heads/*,commit)
97
		# branch
98
		if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then
99
			echo "*** Creating a branch is not allowed in this repository" >&2
100
			exit 1
101
		fi
102
		;;
103
	refs/heads/*,delete)
104
		# delete branch
105
		if [ "$allowdeletebranch" != "true" ]; then
106
			echo "*** Deleting a branch is not allowed in this repository" >&2
107
			exit 1
108
		fi
109
		;;
110
	refs/remotes/*,commit)
111
		# tracking branch
112
		;;
113
	refs/remotes/*,delete)
114
		# delete tracking branch
115
		if [ "$allowdeletebranch" != "true" ]; then
116
			echo "*** Deleting a tracking branch is not allowed in this repository" >&2
117
			exit 1
118
		fi
119
		;;
120
	*)
121
		# Anything else (is there anything else?)
122
		echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
123
		exit 1
124
		;;
125
esac
126

  
127
# --- Finished
128
exit 0
b/Assets/Plugins/UnityHTTP/.git/info/exclude
1
# git ls-files --others --exclude-from=.git/info/exclude
2
# Lines that start with '#' are comments.
3
# For a project mostly in C, the following would be a good set of
4
# exclude patterns (uncomment them if you want to use them):
5
# *.[oa]
6
# *~
b/Assets/Plugins/UnityHTTP/.git/logs/HEAD
1
0000000000000000000000000000000000000000 49515d0b24f5ee3e8608467b51e0aa62670e16b2 Gershon Dublon <gershon@gershon-2.local> 1397319348 -0400	clone: from https://github.com/andyburke/UnityHTTP.git
b/Assets/Plugins/UnityHTTP/.git/logs/refs/heads/master
1
0000000000000000000000000000000000000000 49515d0b24f5ee3e8608467b51e0aa62670e16b2 Gershon Dublon <gershon@gershon-2.local> 1397319348 -0400	clone: from https://github.com/andyburke/UnityHTTP.git
b/Assets/Plugins/UnityHTTP/.git/logs/refs/remotes/origin/HEAD
1
0000000000000000000000000000000000000000 49515d0b24f5ee3e8608467b51e0aa62670e16b2 Gershon Dublon <gershon@gershon-2.local> 1397319348 -0400	clone: from https://github.com/andyburke/UnityHTTP.git
b/Assets/Plugins/UnityHTTP/.git/packed-refs
1
# pack-refs with: peeled fully-peeled 
2
49515d0b24f5ee3e8608467b51e0aa62670e16b2 refs/remotes/origin/master
b/Assets/Plugins/UnityHTTP/.git/refs/heads/master
1
49515d0b24f5ee3e8608467b51e0aa62670e16b2
b/Assets/Plugins/UnityHTTP/.git/refs/remotes/origin/HEAD
1
ref: refs/remotes/origin/master
b/Assets/Plugins/UnityHTTP/CookieJar.cs
1
using System;
2
using System.Collections.Generic;
3
using System.Text.RegularExpressions;
4

  
5
// Based on node-cookiejar (https://github.com/bmeck/node-cookiejar)
6

  
7
namespace HTTP
8
{
9
	public class CookieAccessInfo
10
	{
11
		public string domain = null;
12
		public string path = null;
13
		public bool secure = false;
14
		public bool scriptAccessible = true;
15
		
16
		public CookieAccessInfo( string domain, string path )
17
		{
18
			this.domain = domain;
19
			this.path = path;
20
		}
21
		
22
		public CookieAccessInfo( string domain, string path, bool secure )
23
		{
24
			this.domain = domain;
25
			this.path = path;
26
			this.secure = secure;
27
		}
28
		
29
		public CookieAccessInfo( string domain, string path, bool secure, bool scriptAccessible )
30
		{
31
			this.domain = domain;
32
			this.path = path;
33
			this.secure = secure;
34
			this.scriptAccessible = scriptAccessible;
35
		}
36
		
37
		public CookieAccessInfo( Cookie cookie )
38
		{
39
			this.domain = cookie.domain;
40
			this.path = cookie.path;
41
			this.secure = cookie.secure;
42
			this.scriptAccessible = cookie.scriptAccessible;
43
		}
44
	}
45
	
46
	public class Cookie
47
	{
48
		public string name = null;
49
		public string value = null;
50
		public DateTime expirationDate = DateTime.MaxValue;
51
		public string path = null;
52
		public string domain = null;
53
		public bool secure = false;
54
		public bool scriptAccessible = true;
55
		
56
		private static string cookiePattern = "\\s*([^=]+)(?:=((?:.|\\n)*))?";
57
		
58
		public Cookie( string cookieString )
59
		{
60
			string[] parts = cookieString.Split( ';' );
61
			foreach ( string part in parts )
62
			{
63
                
64
				Match match = Regex.Match( part, cookiePattern );
65
	
66
				if ( !match.Success )
67
				{
68
					throw new Exception( "Could not parse cookie string: " + cookieString );
69
				}
70
				
71
				if ( this.name == null )
72
				{
73
					this.name = match.Groups[ 1 ].Value;
74
					this.value = match.Groups[ 2 ].Value;
75
					continue;
76
				}
77
				
78
				switch( match.Groups[ 1 ].Value.ToLower() )
79
				{
80
				case "httponly":
81
					this.scriptAccessible = false;
82
					break;
83
				case "expires":
84
					this.expirationDate = DateTime.Parse( match.Groups[ 2 ].Value );
85
					break;
86
				case "path":
87
					this.path = match.Groups[ 2 ].Value;
88
					break;
89
				case "domain":
90
					this.domain = match.Groups[ 2 ].Value;
91
					break;
92
				case "secure":
93
					this.secure = true;
94
					break;
95
				default:
96
					// TODO: warn of unknown cookie setting?
97
					break;
98
				}
99
			}
100
		}
101
		
102
		public bool Matches( CookieAccessInfo accessInfo )
103
		{
104
			if (    this.secure != accessInfo.secure
105
			     || !this.CollidesWith( accessInfo ) )
106
			{
107
				return false;
108
			}
109
			
110
			return true;
111
		}
112
	
113
		public bool CollidesWith( CookieAccessInfo accessInfo )
114
		{
115
			if ( ( this.path != null && accessInfo.path == null ) || ( this.domain != null && accessInfo.domain == null ) )
116
			{
117
				return false;
118
			}
119
			
120
			if ( this.path != null && accessInfo.path != null && accessInfo.path.IndexOf( this.path ) != 0 )
121
			{
122
                return false;
123
			}
124
			
125
			if ( this.domain == accessInfo.domain )
126
			{
127
                return true;
128
			}
129
			else if ( this.domain != null && this.domain.Length >= 1 && this.domain[ 0 ] == '.' )
130
			{
131
                int wildcard = accessInfo.domain.IndexOf( this.domain.Substring( 1 ) );
132
				if( wildcard == -1 || wildcard != accessInfo.domain.Length - this.domain.Length + 1 )
133
				{
134
                    return false;
135
				}
136
			}
137
			else if ( this.domain != null )
138
			{
139
                return false;
140
			}
141

  
142
            return true;
143
		}
144
		
145
		public string ToValueString()
146
		{
147
			return this.name + "=" + this.value;
148
		}
149
		
150
		public override string ToString()
151
		{
152
			List< string > elements = new List< string >();
153
			elements.Add( this.name + "=" + this.value );
154
			
155
			if( this.expirationDate != DateTime.MaxValue )
156
			{
157
				elements.Add( "expires=" + this.expirationDate.ToString() );
158
			}
159

  
160
			if( this.domain != null )
161
			{
162
				elements.Add( "domain=" + this.domain );
163
			}
164

  
165
			if( this.path != null )
166
			{
167
				elements.Add( "path=" + this.path );
168
			}
169
			
170
			if( this.secure )
171
			{
172
				elements.Add( "secure" );
173
			}
174
	
175
			if( this.scriptAccessible == false )
176
			{
177
				elements.Add( "httponly" );
178
			}
179
			
180
			return String.Join( "; ", elements.ToArray() );
181
		}
182
	}
183
	
184
    public delegate void ContentsChangedDelegate();    
185
    
186
	public class CookieJar
187
	{
188
		private static string version = "v2";
189
        private object cookieJarLock = new object();
190

  
191
		private static CookieJar instance;
192
		public Dictionary< string, List< Cookie > > cookies;
193

  
194
        public ContentsChangedDelegate ContentsChanged;
195
		
196
		public static CookieJar Instance
197
		{
198
			get
199
			{
200
				if ( instance == null )
201
				{
202
					instance = new CookieJar();
203
				}
204
				return instance;
205
			}
206
		}
207
		
208
		public CookieJar ()
209
		{
210
            this.Clear();
211
		}
212
        
213
        public void Clear()
214
        {
215
            lock( cookieJarLock )
216
            {
217
                cookies = new Dictionary< string, List< Cookie > >();
218
                if ( ContentsChanged != null )
219
                {
220
                    ContentsChanged();
221
                }
222
            }
223
        }
224

  
225
		public bool SetCookie( Cookie cookie )
226
		{
227
            lock( cookieJarLock )
228
            {
229
                bool expired = cookie.expirationDate < DateTime.Now;
230
            
231
                if ( cookies.ContainsKey( cookie.name ) )
232
                {
233
                    for( int index = 0; index < cookies[ cookie.name ].Count; ++index )
234
                    {
235
                        Cookie collidableCookie = cookies[ cookie.name ][ index ];
236
                        if ( collidableCookie.CollidesWith( new CookieAccessInfo( cookie ) ) )
237
                        {
238
                            if( expired )
239
                            {
240
                                cookies[ cookie.name ].RemoveAt( index );
241
                                if ( cookies[ cookie.name ].Count == 0 )
242
                                {
243
                                    cookies.Remove( cookie.name );
244
                                    if ( ContentsChanged != null )
245
                                    {
246
                                        ContentsChanged();
247
                                    }
248
                                }
249
                                
250
                                return false;
251
                            }
252
                            else
253
                            {
254
                                cookies[ cookie.name ][ index ] = cookie;
255
                                if ( ContentsChanged != null )
256
                                {
257
                                    ContentsChanged();
258
                                }
259
                                return true;
260
                            }
261
                        }
262
                    }
263
                    
264
                    if ( expired )
265
                    {
266
                        return false;
267
                    }
268
                    
269
                    cookies[ cookie.name ].Add( cookie );
270
                    if ( ContentsChanged != null )
271
                    {
272
                        ContentsChanged();
273
                    }
274
                    return true;
275
                }
276
    
277
                if ( expired )
278
                {
279
                    return false;
280
                }
281
    
282
                cookies[ cookie.name ] = new List< Cookie >();
283
                cookies[ cookie.name ].Add( cookie );
284
                if ( ContentsChanged != null )
285
                {
286
                    ContentsChanged();
287
                }
288
                return true;
289
            }
290
		}
291
		
292
        // TODO: figure out a way to respect the scriptAccessible flag and supress cookies being
293
        //       returned that should not be.  The issue is that at some point, within this
294
        //       library, we need to send all the correct cookies back in the request.  Right now
295
        //       there's no way to add all cookies (regardless of script accessibility) to the
296
        //       request without exposing cookies that should not be script accessible.
297
        
298
		public Cookie GetCookie( string name, CookieAccessInfo accessInfo )
299
		{
300
			if ( !cookies.ContainsKey( name ) )
301
			{
302
                return null;
303
			}
304
			
305
			for ( int index = 0; index < cookies[ name ].Count; ++index )
306
			{
307
				Cookie cookie = cookies[ name ][ index ];
308
				if ( cookie.expirationDate > DateTime.Now && cookie.Matches( accessInfo ) )
309
				{
310
                    return cookie;
311
				}
312
			}
313
			
314
            return null;
315
		}
316
		
317
		public List< Cookie > GetCookies( CookieAccessInfo accessInfo )
318
		{
319
			List< Cookie > result = new List< Cookie >();
320
			foreach ( string cookieName in cookies.Keys )
321
			{
322
                Cookie cookie = this.GetCookie( cookieName, accessInfo );
323
				if ( cookie != null )
324
				{
325
                    result.Add( cookie );
326
				}
327
			}
328
			
329
			return result;
330
		}
331
		
332
		public void SetCookies( Cookie[] cookieObjects )
333
		{
334
			for ( var index = 0; index < cookieObjects.Length; ++index )
335
			{
336
				this.SetCookie( cookieObjects[ index ] );
337
			}
338
		}
339
		
340
		private static string cookiesStringPattern = "[:](?=\\s*[a-zA-Z0-9_\\-]+\\s*[=])";
341

  
342
		public void SetCookies( string cookiesString )
343
		{
344
			
345
			Match match = Regex.Match( cookiesString, cookiesStringPattern );
346

  
347
			if ( !match.Success )
348
			{
349
				throw new Exception( "Could not parse cookies string: " + cookiesString );
350
			}
351
			
352
			for ( int index = 0; index < match.Groups.Count; ++index )
353
			{
354
				this.SetCookie( new Cookie( match.Groups[ index ].Value ) );
355
			}
356
		}
357

  
358
        private static string boundary = "\n!!::!!\n";
359

  
360
        public string Serialize()
361
        {
362
            string result = version + boundary;
363

  
364
            lock( cookieJarLock )
365
            {
366
                foreach ( string key in cookies.Keys )
367
                {
368
                    for ( int index = 0; index < cookies[ key ].Count; ++index )
369
                    {
370
                        result += cookies[ key ][ index ].ToString() + boundary;
371
                    }
372
                }
373
            }
374
                
375
            return result;
376
        }
377
        
378
        public void Deserialize( string cookieJarString, bool clear )
379
        {
380
            if ( clear )
381
            {
382
                this.Clear();
383
            }
384

  
385
            Regex regex = new Regex( boundary );
386
            string[] cookieStrings = regex.Split( cookieJarString );
387
			bool readVersion = false;
388
            foreach ( string cookieString in cookieStrings )
389
            {
390
				if ( !readVersion )
391
				{
392
					if ( cookieString.IndexOf( version ) != 0 )
393
					{
394
						return;
395
					}
396
					readVersion = true;
397
					continue;
398
				}
399
				
400
                if ( cookieString.Length > 0 )
401
                {
402
                    this.SetCookie( new Cookie( cookieString ) );
403
                }
404
            }
405
        }
406
	}
407
}
b/Assets/Plugins/UnityHTTP/CookieJar.cs.meta
1
fileFormatVersion: 2
2
guid: 442d99c458b3b474f87c874ee99bf01c
3
MonoImporter:
4
  serializedVersion: 2
5
  defaultReferences: []
6
  executionOrder: 0
7
  icon: {instanceID: 0}
8
  userData: 
b/Assets/Plugins/UnityHTTP/DiskCache.cs
1
using UnityEngine;
2
using System.Collections;
3
using System.IO;
4
using System;
5
using HTTP;
6

  
7
namespace HTTP
8
{
9
	public class DiskCacheOperation
10
	{
11
		public bool isDone = false;
12
		public bool fromCache = false;
13
		public Request request = null;
14
	}
15

  
16
#if UNITY_WEBPLAYER
17
	public class DiskCache : MonoBehaviour
18
	{
19
		static DiskCache _instance = null;
20
		public static DiskCache Instance {
21
			get {
22
				if (_instance == null) {
23
					var g = new GameObject ("DiskCache", typeof(DiskCache));
24
					g.hideFlags = HideFlags.HideAndDontSave;
25
					_instance = g.GetComponent<DiskCache> ();
26
				}
27
				return _instance;
28
			}
29
		}
30

  
31
		public DiskCacheOperation Fetch (Request request)
32
		{
33
			var handle = new DiskCacheOperation ();
34
			handle.request = request;
35
			StartCoroutine (Download (request, handle));
36
			return handle;
37
		}
38

  
39
		IEnumerator Download(Request request, DiskCacheOperation handle)
40
		{
41
			request.Send ();
42
			while (!request.isDone)
43
				yield return new WaitForEndOfFrame ();
44
			handle.isDone = true;
45
		}
46
	}
47
#else
48
	public class DiskCache : MonoBehaviour
49
	{
50
		string cachePath = null;
51

  
52
		static DiskCache _instance = null;
53
		public static DiskCache Instance {
54
			get {
55
				if (_instance == null) {
56
					var g = new GameObject ("DiskCache", typeof(DiskCache));
57
					g.hideFlags = HideFlags.HideAndDontSave;
58
					_instance = g.GetComponent<DiskCache> ();
59
				}
60
				return _instance;
61
			}
62
		}
63

  
64
		void Awake ()
65
		{
66
			cachePath = System.IO.Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData), "uwcache");
67
			if (!Directory.Exists (cachePath))
68
				Directory.CreateDirectory (cachePath);
69
		}
70

  
71
		public DiskCacheOperation Fetch (Request request)
72
		{
73
			var guid = "";
74
            // MD5 is disposable
75
            // http://msdn.microsoft.com/en-us/library/system.security.cryptography.md5.aspx#3
76
            using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create ()) {
77
                foreach (var b in md5.ComputeHash (System.Text.ASCIIEncoding.ASCII.GetBytes (request.uri.ToString ()))) {
78
                    guid = guid + b.ToString ("X2");
79
                }
80
            }
81

  
82
			var filename = System.IO.Path.Combine (cachePath, guid);
83
			if (File.Exists (filename) && File.Exists (filename + ".etag"))
84
				request.SetHeader ("If-None-Match", File.ReadAllText (filename + ".etag"));
85
			var handle = new DiskCacheOperation ();
86
			handle.request = request;
87
			StartCoroutine (DownloadAndSave (request, filename, handle));
88
			return handle;
89
		}
90

  
91
		IEnumerator DownloadAndSave (Request request, string filename, DiskCacheOperation handle)
92
		{
93
			var useCachedVersion = File.Exists(filename);
94
            Action< HTTP.Request > callback = request.completedCallback;
95
			request.Send(); // will clear the completedCallback
96
			while (!request.isDone)
97
				yield return new WaitForEndOfFrame ();
98
			if (request.exception == null && request.response != null) {
99
				if (request.response.status == 200) {
100
					var etag = request.response.GetHeader ("etag");
101
					if (etag != "") {
102
						File.WriteAllBytes (filename, request.response.bytes);
103
						File.WriteAllText (filename + ".etag", etag);
104
					}
105
					useCachedVersion = false;
106
				}
107
			}
108

  
109
			if(useCachedVersion) {
110
				if(request.exception != null) {
111
					Debug.LogWarning("Using cached version due to exception:" + request.exception);
112
					request.exception = null;
113
				}
114
				request.response.status = 304;
115
				request.response.bytes = File.ReadAllBytes (filename);
116
				request.isDone = true;
117
			}
118
			handle.isDone = true;
119

  
120
            if ( callback != null )
121
            {
122
                callback( request );
123
            }
124
		}
125

  
126
	}
127
#endif
128
}
b/Assets/Plugins/UnityHTTP/DiskCache.cs.meta
1
fileFormatVersion: 2
2
guid: aed0c7c5135274839ae73978ed82f229
3
MonoImporter:
4
  serializedVersion: 2
5
  defaultReferences: []
6
  executionOrder: 0
7
  icon: {instanceID: 0}
8
  userData: 
b/Assets/Plugins/UnityHTTP/HTTP.csproj
1
<?xml version="1.0" encoding="utf-8"?>
2
<Project DefaultTargets="Build" ToolsVersion="3.5" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3
  <PropertyGroup>
4
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
5
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
6
    <ProductVersion>9.0.21022</ProductVersion>
7
    <SchemaVersion>2.0</SchemaVersion>
8
    <ProjectGuid>{8E94F9A4-3E1E-42F4-86E8-58270D44A4D8}</ProjectGuid>
9
    <OutputType>Library</OutputType>
10
    <RootNamespace>HTTP</RootNamespace>
11
    <AssemblyName>HTTP</AssemblyName>
12
    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
13
    <ReleaseVersion>0.3</ReleaseVersion>
14
  </PropertyGroup>
15
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
16
    <DebugSymbols>true</DebugSymbols>
17
    <DebugType>full</DebugType>
18
    <Optimize>false</Optimize>
19
    <OutputPath>bin\Debug</OutputPath>
20
    <DefineConstants>DEBUG</DefineConstants>
21
    <ErrorReport>prompt</ErrorReport>
22
    <WarningLevel>4</WarningLevel>
23
    <ConsolePause>false</ConsolePause>
24
  </PropertyGroup>
25
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
26
    <DebugType>none</DebugType>
27
    <Optimize>false</Optimize>
28
    <OutputPath>bin\Release</OutputPath>
29
    <ErrorReport>prompt</ErrorReport>
30
    <WarningLevel>4</WarningLevel>
31
    <ConsolePause>false</ConsolePause>
32
  </PropertyGroup>
33
  <ItemGroup>
34
    <Reference Include="System" />
35
    <Reference Include="Ionic.Zlib, Version=1.9.1.5, Culture=neutral, PublicKeyToken=edbe51ad942a3f5c">
36
      <SpecificVersion>False</SpecificVersion>
37
      <HintPath>..\..\..\..\Unity\DMU\Assets\DMU\DLL\Ionic.Zlib.dll</HintPath>
38
    </Reference>
39
    <Reference Include="UnityEngine, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
40
      <SpecificVersion>False</SpecificVersion>
41
      <HintPath>..\..\..\..\..\..\Applications\Unity\Unity.app\Contents\Frameworks\Managed\UnityEngine.dll</HintPath>
42
    </Reference>
43
  </ItemGroup>
44
  <ItemGroup>
45
    <Compile Include="AssemblyInfo.cs" />
46
    <Compile Include="Request.cs" />
47
    <Compile Include="Response.cs" />
48
    <Compile Include="DiskCache.cs" />
49
  </ItemGroup>
50
  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
51
</Project>
b/Assets/Plugins/UnityHTTP/HTTP.csproj.meta
1
fileFormatVersion: 2
2
guid: 2ebd31919153d4fdd83d89c9e8f5c4cd
3
DefaultImporter:
4
  userData: 
b/Assets/Plugins/UnityHTTP/HTTP.pidb.meta
1
fileFormatVersion: 2
2
guid: 52836928634f549edadb7c031f35e13a
3
DefaultImporter:
4
  userData: 
b/Assets/Plugins/UnityHTTP/README.md
1
# Attribution
2

  
3
Based on Simon Wittber's UnityWeb code (http://code.google.com/p/unityweb/).
4

  
5
# About
6

  
7
This is a TcpClient-based HTTP library for use in Unity.  It should work in
8
both the standalone player and in the web player.
9

  
10
It also has convenience methods for working with JSON.
11
# Examples
12

  
13
IEnumerator example:
14

  
15
```C#
16
public IEnumerator SomeRoutine() {
17
    HTTP.Request someRequest = new HTTP.Request( "get", "http://someurl.com/somewhere" );
18
    someRequest.Send();
19

  
20
    while( !someRequest.isDone )
21
    {
22
        yield return null;
23
    }
24

  
25
    // parse some JSON, for example:
26
    JSONObject thing = new JSONObject( request.response.Text );
27
}
28
```
29

  
30
Closure-style (does not need to be in a coroutine):
31

  
32
```C#
33
HTTP.Request someRequest = new HTTP.Request( "get", "http://someurl.com/somewhere" );
34
someRequest.Send( ( request ) => {
35
    // parse some JSON, for example:
36
    JSONObject thing = new JSONObject( request.response.Text );
37
});
38
```
39

  
40
Post request using form data:
41

  
42
```C#
43
WWWForm form = new WWWForm();
44
form.AddField( "something", "yo" );
45
form.AddField( "otherthing", "hey" );
46

  
47
HTTP.Request someRequest = new HTTP.Request( "post", "http://someurl.com/some/post/handler", form );
48
someRequest.Send( ( request ) => {
49
    // parse some JSON, for example:
50
    bool result = false;
51
    Hashtable thing = (Hashtable)JSON.JsonDecode( request.response.Text, ref result );
52
    if ( !result )
53
    {
54
        Debug.LogWarning( "Could not parse JSON response!" );
55
        return;
56
    }
57
});
58
```
59

  
60
Post request using JSON:
61

  
62
```C#
63
Hashtable data = new Hashtable();
64
data.Add( "something", "hey!" );
65
data.Add( "otherthing", "YO!!!!" );
66

  
67
// When you pass a Hashtable as the third argument, we assume you want it send as JSON-encoded
68
// data.  We'll encode it to JSON for you and set the Content-Type header to application/json
69
HTTP.Request theRequest = new HTTP.Request( "post", "http://someurl.com/a/json/post/handler", data );
70
theRequest.Send( ( request ) => {
71

  
72
    // we provide Object and Array convenience methods that attempt to parse the response as JSON
73
    // if the response cannot be parsed, we will return null
74
    // note that if you want to send json that isn't either an object ({...}) or an array ([...])
75
    // that you should use JSON.JsonDecode directly on the response.Text, Object and Array are
76
    // only provided for convenience
77
    Hashtable result = request.response.Object;
78
    if ( result == null )
79
    {
80
        Debug.LogWarning( "Could not parse JSON response!" );
81
        return;
82
    }
83
  
84
});
85
```
86

  
87
If you want to make a request while not in Play Mode (e. g. from a custom Editor menu command or wizard), you must use the Request synchronously, since Unity's main update loop is not running. The call will block until the response is available.
88

  
89
```C#
90
Hashtable data = new Hashtable();
91
data.Add( "something", "hey!" );
92
data.Add( "otherthing", "YO!!!!" );
93

  
94
HTTP.Request theRequest = new HTTP.Request("post", "http://someurl.com/a/json/post/handler", data );
95
theRequest.synchronous = true;
96
theRequest.Send((request) => {
97
	EditorUtility.DisplayDialog("Request was posted.", request.response.Text, "Ok");
98
});
99
```
100

  
b/Assets/Plugins/UnityHTTP/README.md.meta
1
fileFormatVersion: 2
2
guid: 28e0d55dee56640259e2333887caf8fd
3
DefaultImporter:
4
  userData: 
b/Assets/Plugins/UnityHTTP/Request.cs
1
using UnityEngine;
2
using System;
3
using System.IO;
4
using System.Text;
5
using System.Collections;
6
using System.Collections.Generic;
7
using System.Net.Sockets;
8
using System.Globalization;
9
using System.Threading;
10
using System.Net.Security;
11
using System.Security.Authentication;
12
using System.Security.Cryptography.X509Certificates;
13

  
14
namespace HTTP
15
{
16
	public class HTTPException : Exception
17
	{
18
		public HTTPException (string message) : base(message)
19
		{
20
		}
21
	}
22

  
23
	public enum RequestState {
24
		Waiting, Reading, Done
25
	}
26

  
27
	public class Request
28
	{
29
        public static bool LogAllRequests = false;
30
        public static bool VerboseLogging = false;
31

  
32
		public CookieJar cookieJar = CookieJar.Instance;
33
		public string method = "GET";
34
		public string protocol = "HTTP/1.1";
35
		public byte[] bytes;
36
		public Uri uri;
37
		public static byte[] EOL = { (byte)'\r', (byte)'\n' };
38
		public Response response = null;
39
		public bool isDone = false;
40
		public int maximumRetryCount = 8;
41
		public bool acceptGzip = true;
42
		public bool useCache = false;
43
		public Exception exception = null;
44
		public RequestState state = RequestState.Waiting;
45
        public long responseTime = 0; // in milliseconds
46
		public bool synchronous = false;
47

  
48
		public Action< HTTP.Request > completedCallback = null;
49

  
50
		Dictionary<string, List<string>> headers = new Dictionary<string, List<string>> ();
51
		static Dictionary<string, string> etags = new Dictionary<string, string> ();
52

  
53
		public Request (string method, string uri)
54
		{
55
			this.method = method;
56
			this.uri = new Uri (uri);
57
		}
58

  
59
		public Request (string method, string uri, bool useCache)
60
		{
61
			this.method = method;
62
			this.uri = new Uri (uri);
63
			this.useCache = useCache;
64
		}
65

  
66
		public Request (string method, string uri, byte[] bytes)
67
		{
68
			this.method = method;
69
			this.uri = new Uri (uri);
70
			this.bytes = bytes;
71
		}
72

  
73
        public Request( string method, string uri, WWWForm form )
74
        {
75
			this.method = method;
76
			this.uri = new Uri (uri);
77
			this.bytes = form.data;
78
            foreach ( DictionaryEntry entry in form.headers )
79
            {
80
                this.AddHeader( (string)entry.Key, (string)entry.Value );
81
            }
82
        }
83

  
84
        public Request( string method, string uri, Hashtable data )
85
        {
86
            this.method = method;
87
            this.uri = new Uri( uri );
88
            this.bytes = Encoding.UTF8.GetBytes( JSON.JsonEncode( data ) );
89
            this.AddHeader( "Content-Type", "application/json" );
90
        }
91
        
92
		public void AddHeader (string name, string value)
93
		{
94
			name = name.ToLower ().Trim ();
95
			value = value.Trim ();
96
			if (!headers.ContainsKey (name))
97
				headers[name] = new List<string> ();
98
			headers[name].Add (value);
99
		}
100

  
101
		public string GetHeader (string name)
102
		{
103
			name = name.ToLower ().Trim ();
104
			if (!headers.ContainsKey (name))
105
				return "";
106
			return headers[name][0];
107
		}
108

  
109
        public List< string > GetHeaders()
110
        {
111
            List< string > result = new List< string >();
112
            foreach (string name in headers.Keys) {
113
				foreach (string value in headers[name]) {
114
                    result.Add( name + ": " + value );
115
				}
116
			}
117

  
118
            return result;
119
        }
120

  
121
		public List<string> GetHeaders (string name)
122
		{
123
			name = name.ToLower ().Trim ();
124
			if (!headers.ContainsKey (name))
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff