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)) |
Also available in: Unified diff