1 00:00:00,000 --> 00:00:00,390 2 00:00:00,390 --> 00:00:02,931 >> DAVID MALAN: Maintenant, nous allons jeter un examiner la répartition réelle 3 00:00:02,931 --> 00:00:04,310 code dans le fichier appelé server.c. 4 00:00:04,310 --> 00:00:06,690 Maintenant, gardez à l'esprit que ce assez grande cette semaine de fichier. 5 00:00:06,690 --> 00:00:09,922 Il est plus de 1000 lignes de code, mais la plupart de ces lignes que nous avons écrit. 6 00:00:09,922 --> 00:00:11,880 Et ce que nous avons laissé est quelques blancs que vous aurez 7 00:00:11,880 --> 00:00:15,088 besoin de remplir d'ajouter certains des plus fonctionnalités intéressantes du serveur web 8 00:00:15,088 --> 00:00:16,300 pour réellement faire démarrer. 9 00:00:16,300 --> 00:00:18,890 En effet, si vous exécutez la distribution code après le compiler 10 00:00:18,890 --> 00:00:21,400 vous verrez que le serveur Web ne pas le faire tant que ça. 11 00:00:21,400 --> 00:00:24,585 Au lieu de cela, l'utilisateur obtient un 501, pas mis en œuvre, message d'erreur. 12 00:00:24,585 --> 00:00:27,210 Mais cela devrait donner un sens parce nous avons en effet pas mis en œuvre 13 00:00:27,210 --> 00:00:28,565 ensemble de ses fonctionnalités. 14 00:00:28,565 --> 00:00:29,940 Donc, nous allons jeter un oeil à server.c. 15 00:00:29,940 --> 00:00:32,500 Et vous aurez envie d'aller plus cela dans un peu plus en détail, 16 00:00:32,500 --> 00:00:34,200 un peu plus lentement, à votre propre rythme. 17 00:00:34,200 --> 00:00:36,616 Mais pour l'instant je vais essayer de guider vous à travers elle pour vous donner 18 00:00:36,616 --> 00:00:39,230 un sens de ce qui est utile pour savoir, ce qui est moins utile de savoir, 19 00:00:39,230 --> 00:00:41,212 de sorte que vous pouvez guider votre propre exploration. 20 00:00:41,212 --> 00:00:44,170 Alors au sommet de server.c, bien sûr, nous avons tout un tas d'définit. 21 00:00:44,170 --> 00:00:46,130 Ainsi que tout un tas de comprend. 22 00:00:46,130 --> 00:00:49,610 À noter est que nous avons quelques constantes globales ici, 23 00:00:49,610 --> 00:00:52,680 que nous utilisons dans notre code pour le rendre en sorte que certains tableaux sont 24 00:00:52,680 --> 00:00:53,780 de longueur suffisante. 25 00:00:53,780 --> 00:00:58,020 Basé sur combien de temps les requêtes HTTP nous attendre à être recevoir, potentiellement, 26 00:00:58,020 --> 00:00:59,860 à partir de clients Web, ou les navigateurs. 27 00:00:59,860 --> 00:01:04,000 >> Pendant ce temps, nous allons faire défiler vers le bas sur ici, pour une définition de type. 28 00:01:04,000 --> 00:01:07,430 Notez que comme dans P set 4, lequel nous avons joué avec le fichier I / O, 29 00:01:07,430 --> 00:01:09,680 de même ici, nous sommes jouant avec beaucoup d'octets. 30 00:01:09,680 --> 00:01:11,490 Et donc nous avons typedeffed carboniser être un octet. 31 00:01:11,490 --> 00:01:16,260 En d'autres termes, le type de données, le capital B-y-t-e, ne existe pas par défaut en C. 32 00:01:16,260 --> 00:01:20,090 Nous avons donc créé comme un synonyme de omble de sorte que nous avons une valeur de 8 bits 33 00:01:20,090 --> 00:01:21,041 avec lesquelles travailler. 34 00:01:21,041 --> 00:01:23,540 Maintenant, il ya tout un tas de prototypes ici, dont quelques-uns 35 00:01:23,540 --> 00:01:26,581 sont les fonctions que vous allez écrire, mais plupart d'entre eux nous nous avons écrit. 36 00:01:26,581 --> 00:01:29,430 Disons faites défiler maintenant, enfin, quelques variables globales. 37 00:01:29,430 --> 00:01:32,036 On est cette étoile de char, Alias ​​racine. 38 00:01:32,036 --> 00:01:34,660 En effet, vous remarquerez que nous ne sommes pas en utilisant la bibliothèque CS50 plus. 39 00:01:34,660 --> 00:01:36,330 Donc, nous sommes à la place juste en utilisant l'omble étoiles. 40 00:01:36,330 --> 00:01:38,960 Et racine est va être un pointeur vers la chaîne 41 00:01:38,960 --> 00:01:41,700 représente la racine du serveur. 42 00:01:41,700 --> 00:01:44,030 Ainsi, par exemple, quand je exécuté la commande précédente 43 00:01:44,030 --> 00:01:48,100 et spécifié la racine du mot «public», ce répertoire à l'intérieur de la distribution 44 00:01:48,100 --> 00:01:48,800 code. 45 00:01:48,800 --> 00:01:52,160 Root, ici, serait un pointeur exactement cette chaîne, «public». 46 00:01:52,160 --> 00:01:57,830 Ou vraiment le chemin complet / home / ubuntu / ainsi de suite dans ce répertoire public. 47 00:01:57,830 --> 00:02:01,930 >> Pendant ce temps, dans la ligne 67 ici, nous avons ce qu'on appelle des descripteurs de fichiers. 48 00:02:01,930 --> 00:02:05,329 Ceux-ci sont dans le même esprit de déposer des pointeurs étoiles. 49 00:02:05,329 --> 00:02:07,370 Mais il se trouve qu'il ya un autre ensemble de fonctions 50 00:02:07,370 --> 00:02:11,050 vous pouvez utiliser avec la lecture de fichiers ou lecture de connexions réseau. 51 00:02:11,050 --> 00:02:13,280 Comme une toile de serveur web connexion navigateur 52 00:02:13,280 --> 00:02:16,480 effectivement utilise tout entiers à la place des pointeurs, comme nous l'avons vu sur P Set 4. 53 00:02:16,480 --> 00:02:17,530 Mais il est la même idée. 54 00:02:17,530 --> 00:02:21,180 Et je l'ai fait ces échelle mondiale pour continuer piste d'un descripteur de fichier client. 55 00:02:21,180 --> 00:02:22,960 Comme un pointeur à mon client Web. 56 00:02:22,960 --> 00:02:24,212 Et un descripteur de fichier du serveur. 57 00:02:24,212 --> 00:02:27,170 Sorte d'un pointeur vers le serveur web, mais ils ne sont pas réellement des pointeurs, 58 00:02:27,170 --> 00:02:28,360 ils sont juste des chiffres. 59 00:02:28,360 --> 00:02:30,940 >> Enfin, nous avons cette mondial la variable appelée ici signalée. 60 00:02:30,940 --> 00:02:32,690 Quelle est ma façon, la vraie ou faux, de garder 61 00:02:32,690 --> 00:02:35,450 piste de si l'utilisateur a a signalé qu'il ou elle veut 62 00:02:35,450 --> 00:02:36,680 pour arrêter le serveur web. 63 00:02:36,680 --> 00:02:39,690 Et en effet, il ya une fonction qui écoute pour le contrôle C. 64 00:02:39,690 --> 00:02:43,650 Alors que si vous, l'utilisateur, veulent tuer le serveur en frappant de contrôle C, 65 00:02:43,650 --> 00:02:46,279 que vous aurez variable booléenne voir dans le code est mis à true. 66 00:02:46,279 --> 00:02:49,070 Et puis dans une boucle nous gardons vérifier la valeur de cette variable. 67 00:02:49,070 --> 00:02:52,560 Et si il est vrai, nous avons juste de cesser complètement le programme. 68 00:02:52,560 --> 00:02:54,050 >> Prenons maintenant un regard sur principale. 69 00:02:54,050 --> 00:02:56,050 Vous ne devez comprendre tout en principal, 70 00:02:56,050 --> 00:02:58,030 mais nous allons vous donner une idée de l'ensemble du flux. 71 00:02:58,030 --> 00:03:00,571 Et alors jetez un oeil de plus près vous-même à certains des commentaires. 72 00:03:00,571 --> 00:03:02,410 En premier lieu, façon de partie grâce principale, 73 00:03:02,410 --> 00:03:04,050 nous analysons les arguments de ligne de commande. 74 00:03:04,050 --> 00:03:06,360 Il se trouve que le principal est va attendre soit à bord 75 00:03:06,360 --> 00:03:09,700 h de l'aide, qui vous explique comment tout pour exécuter le programme de façon très succincte. 76 00:03:09,700 --> 00:03:12,000 Ou un tiret p, ce qui permet de vous spécifiez un port. 77 00:03:12,000 --> 00:03:14,550 Mais encore une fois, en utilisant la port 80 80, par défaut, 78 00:03:14,550 --> 00:03:16,940 est ce que vous devez utiliser CS 50 IDE. 79 00:03:16,940 --> 00:03:18,800 >> Ensuite, nous venons de faire quelques vérifications d'erreur. 80 00:03:18,800 --> 00:03:20,650 Faire en sorte que la valeur de port est en effet 81 00:03:20,650 --> 00:03:22,770 comme nous le prévoyons, dans une gamme particulière. 82 00:03:22,770 --> 00:03:24,630 Et puis peu de la magie commence. 83 00:03:24,630 --> 00:03:26,930 Nous appelons cette fonction Start, qui nous avons écrit. 84 00:03:26,930 --> 00:03:31,360 Nous passons dans avec le port, comme ainsi que tous les arguments optionnels 85 00:03:31,360 --> 00:03:33,770 afin de démarrer le serveur. 86 00:03:33,770 --> 00:03:35,830 Plus précisément, ce numéro de port. 87 00:03:35,830 --> 00:03:39,750 >> Tout droit, à côté, cela est assez cryptique code qui vous ne verrez pas trop souvent, 88 00:03:39,750 --> 00:03:43,170 mais il est une façon élégante de révélateur le programme à écouter pour un signal. 89 00:03:43,170 --> 00:03:46,200 Un signal étant quelque chose comme un AVC touche spéciale, comme le contrôle C. 90 00:03:46,200 --> 00:03:50,010 Donc, ce code est de savoir comment nous enregistrons ce qu'on appelle un écouteur d'événement. 91 00:03:50,010 --> 00:03:54,420 De sorte que, quand l'utilisateur appuie sur Contrôle C ce code indique à l'ordinateur 92 00:03:54,420 --> 00:03:56,200 pour exécuter une fonction appelée gestionnaire. 93 00:03:56,200 --> 00:03:59,844 Qui est écrit plus bas, mis en œuvre plus bas dans ce fichier, server.c, 94 00:03:59,844 --> 00:04:01,260 qui arrête complètement le programme. 95 00:04:01,260 --> 00:04:04,060 Mais ne vous inquiétez pas à propos de les détails internes là. 96 00:04:04,060 --> 00:04:06,010 >> Concentrons-nous maintenant sur la boucle interne. 97 00:04:06,010 --> 00:04:09,164 En effet, ce que le serveur web est en train de faire est délibérément boucle infinie. 98 00:04:09,164 --> 00:04:12,080 Parce que, après tout ce qui est à peu près ce que vous voulez un serveur web à faire. 99 00:04:12,080 --> 00:04:13,910 Jusqu'à ce que vous explicitement arrêter, vous voulez juste 100 00:04:13,910 --> 00:04:15,660 pour y être assis efficacement dans une boucle, 101 00:04:15,660 --> 00:04:17,970 attendant que quelqu'un sur le Internet pour se connecter à elle. 102 00:04:17,970 --> 00:04:20,519 Alors que le serveur Web peut puis répondre à certaines demande. 103 00:04:20,519 --> 00:04:22,780 >> Maintenant, remarquez au sommet du programme Je gratuitement 104 00:04:22,780 --> 00:04:26,030 certaines variables, parce que plus tard vous aurez nous voyons avec malloc dans certains endroits. 105 00:04:26,030 --> 00:04:27,988 Donc, je veux juste faire vous que tous mes variables 106 00:04:27,988 --> 00:04:30,487 sont initialisés à des valeurs connues. 107 00:04:30,487 --> 00:04:32,820 Ici-bas, je vérifie si la programme a été signalé. 108 00:04:32,820 --> 00:04:35,944 En d'autres termes, si l'utilisateur le contrôle frappé C, disons simplement quitter sur cette boucle 109 00:04:35,944 --> 00:04:37,150 en appelant arrêt. 110 00:04:37,150 --> 00:04:40,060 >> Et puis maintenant ce code obtient un peu plus intéressant. 111 00:04:40,060 --> 00:04:42,460 Mais notez que vous ne devez pas d'écrire quoi que ce soit dans le principal. 112 00:04:42,460 --> 00:04:44,760 Plutôt, à l'intérieur de la principale nous faisons ce qui suit. 113 00:04:44,760 --> 00:04:47,520 Si l'utilisateur a connected-- cela est une fonction que nous avons écrit, 114 00:04:47,520 --> 00:04:48,880 qui retourne vrai ou faux. 115 00:04:48,880 --> 00:04:51,760 Et chaque fois qu'il est appelé il dit seulement, oui, un client, 116 00:04:51,760 --> 00:04:53,550 un navigateur est connecté au serveur. 117 00:04:53,550 --> 00:04:54,660 Ou, non, il n'a pas. 118 00:04:54,660 --> 00:04:57,820 Et de cette manière que nous venons boucle infinie attente pour vrai 119 00:04:57,820 --> 00:04:59,610 à renvoyer par cette fonction. 120 00:04:59,610 --> 00:05:02,590 >> Pendant ce temps, cette fonction suivante, demande, nous a également écrit pour vous. 121 00:05:02,590 --> 00:05:07,160 Cela prend tout ce qui est à l'intérieur de cette enveloppe virtuelle, que l'on appelle HTTP 122 00:05:07,160 --> 00:05:10,180 demander, et effectivement il analyse pour ainsi dire. 123 00:05:10,180 --> 00:05:13,260 En regardant cela de haut en bas, de gauche à droite, et les charges 124 00:05:13,260 --> 00:05:14,620 tous ces premières lignes. 125 00:05:14,620 --> 00:05:17,250 Comme la ligne de get et rien d'autre en dessous, 126 00:05:17,250 --> 00:05:19,230 dans une variable que nous avons appelé message. 127 00:05:19,230 --> 00:05:20,590 Pour un message HTTP. 128 00:05:20,590 --> 00:05:23,234 Et nous avons également chargé sa longueur en longueur. 129 00:05:23,234 --> 00:05:24,400 Maintenant, cela est un peu différent. 130 00:05:24,400 --> 00:05:25,650 Donc, nous allons jeter un coup d'œil à ce sujet. 131 00:05:25,650 --> 00:05:27,110 Même si vous ne le faites pas avoir à mettre en oeuvre la demande, 132 00:05:27,110 --> 00:05:29,610 il est utile, peut-être, comprendre comment il fonctionne. 133 00:05:29,610 --> 00:05:33,450 Cette demande de la fonction apparemment est prise dans deux arguments, un message 134 00:05:33,450 --> 00:05:33,960 et la longueur. 135 00:05:33,960 --> 00:05:38,400 Mais remarquez que je suis de passage dans un esperluette à la fois un message et de la longueur. 136 00:05:38,400 --> 00:05:42,100 Mais si nous défiler vers le haut, ce qui sont un message et de la longueur? 137 00:05:42,100 --> 00:05:44,795 >> Eh bien remarquer que message et longueur sont déclarés à l'intérieur 138 00:05:44,795 --> 00:05:47,900 du principal d'être une star char. 139 00:05:47,900 --> 00:05:49,170 Et une taille t. 140 00:05:49,170 --> 00:05:51,710 Qui est vraiment juste un int, respectivement. 141 00:05:51,710 --> 00:05:55,830 Alors, quel est curieux ici, cependant, est que si le message est une étoile char 142 00:05:55,830 --> 00:06:01,160 mais je suis de passage dans des esperluette message, qui est une sorte de technologie 143 00:06:01,160 --> 00:06:04,475 obtenir l'adresse d'un pointeur. 144 00:06:04,475 --> 00:06:06,550 Un double pointeur, si vous voulez. 145 00:06:06,550 --> 00:06:08,740 >> Et en fait, si je fais défiler vers le bas. 146 00:06:08,740 --> 00:06:13,470 Chemin vers le bas dans ce fichier, où demande est effectivement mis en oeuvre, 147 00:06:13,470 --> 00:06:16,770 Je vais voir ce qui suit signature, ou un prototype, 148 00:06:16,770 --> 00:06:17,520 pour cette fonction. 149 00:06:17,520 --> 00:06:19,580 Que vous avez probablement jamais vu auparavant. 150 00:06:19,580 --> 00:06:21,180 La fonction de requête renvoie un booléen. 151 00:06:21,180 --> 00:06:22,430 Voilà probablement familier. 152 00:06:22,430 --> 00:06:23,830 Mais remarquez son premier argument. 153 00:06:23,830 --> 00:06:26,329 Il a appelé un message, mais je aurait pu appelé quelque chose ici. 154 00:06:26,329 --> 00:06:27,575 Mais il est star omble. 155 00:06:27,575 --> 00:06:29,420 >> Et cela est une sorte de chose intéressante. 156 00:06:29,420 --> 00:06:33,620 Parce que je veux cette fonction demander à allouer de la mémoire 157 00:06:33,620 --> 00:06:37,250 toutefois grand pour la requête HTTP en ce que l'enveloppe est virtuel 158 00:06:37,250 --> 00:06:41,670 qu'il reçoit à partir du navigateur, je veulent être en mesure de retourner une chaîne. 159 00:06:41,670 --> 00:06:43,820 Mais je veux aussi être capable de retourner une longueur. 160 00:06:43,820 --> 00:06:46,470 Donc, comme vous le verrez dans le spécification, C, bien sûr, 161 00:06:46,470 --> 00:06:47,850 ne peut pas renvoyer plusieurs valeurs. 162 00:06:47,850 --> 00:06:49,860 Et en fait, je suis seulement retournant un booléen ici. 163 00:06:49,860 --> 00:06:51,860 Mais tout comme nous avons vu dans Lecture à dos pendant que vous 164 00:06:51,860 --> 00:06:57,920 peut retourner deux valeurs si vous passer deux valeurs de référence. 165 00:06:57,920 --> 00:06:59,110 Ou par pointeur. 166 00:06:59,110 --> 00:07:03,190 Alors que vous pouvez réellement aller à ces adresses, mis valeurs là, 167 00:07:03,190 --> 00:07:05,580 et de manière efficace à travers ce voie de retour, pour ainsi dire, 168 00:07:05,580 --> 00:07:08,880 peut faire un retour de la fonction des valeurs multiples à l'appelant. 169 00:07:08,880 --> 00:07:12,240 >> Dans ce cas, la demande peut retourner trois valeurs. 170 00:07:12,240 --> 00:07:14,140 Son type de rendement réel, un booléen. 171 00:07:14,140 --> 00:07:16,490 Le message, une étoile char étoiles. 172 00:07:16,490 --> 00:07:18,590 Et la longueur, une taille t. 173 00:07:18,590 --> 00:07:19,810 Qui est juste un int. 174 00:07:19,810 --> 00:07:23,100 Parce que cette demande de fonction peut aller à la longueur de l'adresse 175 00:07:23,100 --> 00:07:24,340 et de mettre une valeur il. 176 00:07:24,340 --> 00:07:26,970 Et il peut aller à l'adresse de message et mettre une valeur il. 177 00:07:26,970 --> 00:07:28,380 Et que maintenant doit avoir un sens. 178 00:07:28,380 --> 00:07:32,740 >> Parce que même si un message est une étoile char étoiles, dès que 179 00:07:32,740 --> 00:07:37,156 vous y allez avec le message d'étoiles, que nous avons vu auparavant dans le code, 180 00:07:37,156 --> 00:07:38,280 qu'allez-vous y trouver? 181 00:07:38,280 --> 00:07:41,030 Vous allez trouver attendant vous là, un morceau de mémoire 182 00:07:41,030 --> 00:07:43,200 devrait être une star char. 183 00:07:43,200 --> 00:07:44,414 Ou l'adresse d'une chaîne. 184 00:07:44,414 --> 00:07:47,330 Et il est OK si vous ne le faites pas assez enveloppement votre esprit autour de ce trop rapidement. 185 00:07:47,330 --> 00:07:51,470 Mais considérer que tout ce que nous faisons est de prendre l'adresse d'un pointeur 186 00:07:51,470 --> 00:07:53,980 afin que nous puissions y aller et effectivement mis un pointeur là. 187 00:07:53,980 --> 00:07:56,510 Mais ne vous inquiétez pas si ce ne fait pas couler en ce moment. 188 00:07:56,510 --> 00:07:59,080 Savons pour l'instant que le fonction de la demande effective 189 00:07:59,080 --> 00:08:00,800 vous offre ces trois valeurs. 190 00:08:00,800 --> 00:08:02,290 >> Passons donc maintenant de retour à principal. 191 00:08:02,290 --> 00:08:06,570 Que se passe sur la prochaine, en principale, est la suivante. 192 00:08:06,570 --> 00:08:12,020 Une fois que je l'ai eu à l'intérieur des messages et la longueur, les deux valeurs que je soucient. 193 00:08:12,020 --> 00:08:14,340 Ensuite, nous allons de l'avant et à écrire du code pour vous que 194 00:08:14,340 --> 00:08:16,807 vous permet de lire seulement la première ligne. 195 00:08:16,807 --> 00:08:18,640 La demande dite ligne de la demande. 196 00:08:18,640 --> 00:08:23,880 Plus précisément, quelque chose comme GET / HTTP 1.1, et rien de plus. 197 00:08:23,880 --> 00:08:26,200 Donc, il ya tout un tas de d'autres en-têtes HTTP, rappel, 198 00:08:26,200 --> 00:08:28,680 qu'un navigateur envoie à partir de un client à un serveur. 199 00:08:28,680 --> 00:08:31,790 Nous sommes juste en ignorant tous ceux sorte que tout ce que vous voyez sur la fenêtre de terminal, 200 00:08:31,790 --> 00:08:38,559 rappel, est juste quelque chose comme, get / Hello.html HTP / 1.1. 201 00:08:38,559 --> 00:08:41,182 >> Donc remarquer cependant, que ceux-ci trucs que nous faisons ici 202 00:08:41,182 --> 00:08:43,890 vont être utile, peut-être, dans votre propre fonction d'analyse qui 203 00:08:43,890 --> 00:08:44,934 vous allez mettre en œuvre. 204 00:08:44,934 --> 00:08:46,850 Remarquez comment que je suis juste déclarer une variable. 205 00:08:46,850 --> 00:08:49,650 Arrive à être const, ce qui signifie, Je promets de ne pas changer cette situation. 206 00:08:49,650 --> 00:08:50,720 Appelé botte de foin. 207 00:08:50,720 --> 00:08:52,860 Puis je habilement nommé mon prochain aiguille variable 208 00:08:52,860 --> 00:08:56,130 de sorte que je peux regarder proverbialement une aiguille dans une botte de foin, 209 00:08:56,130 --> 00:08:58,530 en utilisant un super pratique fonction appelée str str. 210 00:08:58,530 --> 00:09:02,860 S-T-R S-T-R, qui par son homme page ou par reference.CS50.NET, 211 00:09:02,860 --> 00:09:05,220 vous permet de rechercher des une corde dans un autre. 212 00:09:05,220 --> 00:09:08,770 Et ceci est ma façon de la recherche de la fin d'une ligne 213 00:09:08,770 --> 00:09:11,750 de sorte que je peux réellement lu juste une ligne dans la mémoire. 214 00:09:11,750 --> 00:09:14,860 >> Pendant ce temps, remarquez sur ligne 176 ici, je fait 215 00:09:14,860 --> 00:09:17,010 allouer suffisamment de mémoire pour cette ligne. 216 00:09:17,010 --> 00:09:21,350 Et puis en utilisant str et la copie, et en utilisant seulement une notation de support de rayons, 217 00:09:21,350 --> 00:09:23,070 dois-je ranger dans ce tableau? 218 00:09:23,070 --> 00:09:24,926 Exactement ce que la première ligne. 219 00:09:24,926 --> 00:09:28,050 En fait, permettez-moi de simplement sauter sur rapidement du cahier des charges ensemble de problème 220 00:09:28,050 --> 00:09:28,550 six. 221 00:09:28,550 --> 00:09:29,841 Ne lire cela en détail. 222 00:09:29,841 --> 00:09:32,190 Mais ce que vous trouverez est cette ligne particulière ici. 223 00:09:32,190 --> 00:09:34,810 Grâce à quoi basé sur la spécification la définition formelle 224 00:09:34,810 --> 00:09:40,180 HTTP nous spécifions ce que la première ligne doit être de tout navigateur 225 00:09:40,180 --> 00:09:42,970 à un serveur à l'intérieur de ladite dite enveloppe virtuelle. 226 00:09:42,970 --> 00:09:46,390 >> Plus précisément, le navigateur devrait mentionner une méthode, comme un get, 227 00:09:46,390 --> 00:09:47,830 ou par la poste, ou similaire. 228 00:09:47,830 --> 00:09:50,610 Puis littéralement un espace, représenté ici avec juste sp 229 00:09:50,610 --> 00:09:54,110 de sorte qu'il est explicite nous voulons vraiment un espace ici. 230 00:09:54,110 --> 00:09:58,430 Puis demander cibles qui être quelque chose comme /hello.HTML. 231 00:09:58,430 --> 00:09:59,940 Suivi par un autre espace. 232 00:09:59,940 --> 00:10:01,120 Suivi par une version. 233 00:10:01,120 --> 00:10:04,300 Ce qui serait quelque chose comme HTTP / 1.1. 234 00:10:04,300 --> 00:10:07,360 Suivi par C-R-L-C. Qui est un sigle vous allez voir beaucoup 235 00:10:07,360 --> 00:10:08,350 dans la description. 236 00:10:08,350 --> 00:10:11,810 Et ceci est juste une façon élégante de disant r barre oblique inverse, barre oblique inverse n. 237 00:10:11,810 --> 00:10:14,210 En d'autres termes, le chariot retourner, nouvelle ligne. 238 00:10:14,210 --> 00:10:14,896 Ou saut de ligne. 239 00:10:14,896 --> 00:10:16,020 Retour chariot, saut de ligne. 240 00:10:16,020 --> 00:10:17,980 Voilà ce que C-R-L-F signifie. 241 00:10:17,980 --> 00:10:20,180 >> Maintenant, quant à lui, si nous revenir à notre code, 242 00:10:20,180 --> 00:10:22,430 Voyons ce qui reste à faire pour vous. 243 00:10:22,430 --> 00:10:26,350 A l'intérieur de la principale, enfin, il ya Un appel à une fonction d'analyse. 244 00:10:26,350 --> 00:10:30,670 Le but de parse est de prendre ce que première ligne, dont la définition nous 245 00:10:30,670 --> 00:10:34,590 juste vu sur la spécification, et extraire la voie dite absolue 246 00:10:34,590 --> 00:10:35,420 et requête. 247 00:10:35,420 --> 00:10:37,710 Maintenant, jetez un oeil à la spécification pour ce que nous entendons par là. 248 00:10:37,710 --> 00:10:41,380 >> Mais dans la longue histoire courte, cette chose ici, la demande cible, 249 00:10:41,380 --> 00:10:44,670 est une chaîne qui peut être divisé en deux parties. 250 00:10:44,670 --> 00:10:47,680 Ou un chemin absolu comme /hello.HTML. 251 00:10:47,680 --> 00:10:49,590 Suivi par un point d'interrogation en option. 252 00:10:49,590 --> 00:10:52,840 Et puis quelque chose comme q égaux chats, ou q est égal à chiens, 253 00:10:52,840 --> 00:10:55,760 ou un certain nombre de valeur de clé paires que nous avons vu dans la leçon 254 00:10:55,760 --> 00:10:59,420 faisant partie de la paramétrisation d'une requête HTTP. 255 00:10:59,420 --> 00:11:02,150 >> Donc ce que vous allez avoir besoin à faire est de mettre en œuvre l'analyse. 256 00:11:02,150 --> 00:11:05,790 Et comprendre comment itérer sur ligne, qui est tout simplement le premier argument 257 00:11:05,790 --> 00:11:06,890 que nous passons en. 258 00:11:06,890 --> 00:11:09,270 Caractère pour le caractère pour le caractère. 259 00:11:09,270 --> 00:11:11,500 Seulement allant jusqu'à la fin de cette chaîne. 260 00:11:11,500 --> 00:11:15,430 Vous recherchez ce chemin absolu et à la recherche pour cette requête. 261 00:11:15,430 --> 00:11:18,880 Et ce qui est bien sur le fait que Nous vous avons donné dans la documentation 262 00:11:18,880 --> 00:11:21,460 cette définition grammaticale de cette première ligne, 263 00:11:21,460 --> 00:11:24,230 ici vous allez avoir à comprendre sur, eh bien, ce qui est la méthode. 264 00:11:24,230 --> 00:11:25,170 Est valide ou non? 265 00:11:25,170 --> 00:11:27,460 Et nous vous disons dans la spec quand elle est ou non valide. 266 00:11:27,460 --> 00:11:29,120 Recevez, par exemple, sera valable. 267 00:11:29,120 --> 00:11:30,580 Espace sera facile à vérifier. 268 00:11:30,580 --> 00:11:34,460 Tout en utilisant deux semaines style ou problème mettre deux vérification de chaîne de style. 269 00:11:34,460 --> 00:11:35,710 Ou le caractère de contrôle. 270 00:11:35,710 --> 00:11:37,570 >> Demande cible est la chose vous allez vouloir analyser. 271 00:11:37,570 --> 00:11:39,907 Alors jetez un oeil à la spec pour ce qu'il est attendu. 272 00:11:39,907 --> 00:11:41,740 Et puis enfin, HTTP version, vous voulez juste 273 00:11:41,740 --> 00:11:44,931 pour vous assurer qu'il est parmi les versions prises en charge comme HTTP 1.1. 274 00:11:44,931 --> 00:11:47,430 Donc, essentiellement, d'une fonction d'analyse de va être une occasion 275 00:11:47,430 --> 00:11:50,013 se contenter de lire ce caractère de chose pour le caractère pour caractère, 276 00:11:50,013 --> 00:11:53,900 ou corde par corde, en veillant qu'elle corresponde à la présente spécification. 277 00:11:53,900 --> 00:11:54,900 Tout droit, Retour au menu principal. 278 00:11:54,900 --> 00:11:55,858 Voyons ce qu'il en reste. 279 00:11:55,858 --> 00:11:58,230 Donc, supposons que vous avez maintenant mise en œuvre de votre fonction d'analyse. 280 00:11:58,230 --> 00:12:01,500 Nous avons analysé en sortir cette soi-disant chemin absolu et la requête, 281 00:12:01,500 --> 00:12:03,520 ce qui ne principale doivent maintenant faire avec ça? 282 00:12:03,520 --> 00:12:05,440 Eh bien, un, vous verrez dans le code que nous URL 283 00:12:05,440 --> 00:12:09,420 décodé au cas où le navigateur a certains caractères spéciaux codés 284 00:12:09,420 --> 00:12:12,670 et de façon particulière, nous allons de l'avant et de convertir ceux qui reviennent 285 00:12:12,670 --> 00:12:14,640 les caractères ASCII appropriées. 286 00:12:14,640 --> 00:12:20,110 >> Ensuite, nous allons de l'avant et voir si l'utilisateur a demandé /hello.HTML, 287 00:12:20,110 --> 00:12:21,859 ce fichier ne signifient-ils vraiment? 288 00:12:21,859 --> 00:12:24,150 En d'autres termes, nous devons prendre la racine du serveur, 289 00:12:24,150 --> 00:12:27,550 ce chemin vers le répertoire public et concaténer avec quelque chose comme, 290 00:12:27,550 --> 00:12:28,840 Hello.html. 291 00:12:28,840 --> 00:12:31,240 Alors que nous avons un plus grand chaîne qui nous amène exactement 292 00:12:31,240 --> 00:12:37,220 dans le fichier de Hello.html réel sur IDEs CS50 disque dur ou disque. 293 00:12:37,220 --> 00:12:39,730 >> Ensuite, nous vérifions que le chemin existe réellement. 294 00:12:39,730 --> 00:12:42,017 Sinon, nous lançons une 404 erreur pour l'utilisateur. 295 00:12:42,017 --> 00:12:43,850 Et en effet, tout au long de notre code, vous verrez 296 00:12:43,850 --> 00:12:46,630 beaucoup d'utilisations de cette erreur fonction qui nous nous a écrit, 297 00:12:46,630 --> 00:12:48,520 et la spécification vous guide à travers. 298 00:12:48,520 --> 00:12:52,640 Ceci est juste un moyen de revenir autre chose que 200 à l'utilisateur. 299 00:12:52,640 --> 00:12:55,790 >> Maintenant, ici-bas, je vais de l'avant et comprendre est ce que l'utilisateur 300 00:12:55,790 --> 00:12:58,670 a demandé un fichier ou un répertoire. 301 00:12:58,670 --> 00:13:01,290 Parce que si elle est un répertoire, je envie de faire une ou deux choses. 302 00:13:01,290 --> 00:13:08,980 Premièrement, si l'utilisateur visite un URL qui est pour un répertoire, 303 00:13:08,980 --> 00:13:11,920 mais ne se termine pas par une barre oblique, pour des raisons classiques, 304 00:13:11,920 --> 00:13:15,310 Je tiens à vous assurer que nous changeons l'URL à fait terminer par un slash. 305 00:13:15,310 --> 00:13:17,770 Et vous le verrez dans la source code que nous vous avons donné, 306 00:13:17,770 --> 00:13:21,980 nous forçons à l'utilisateur de rediriger de ne pas [? fu?] mais [? fu /,?] si elles ont fait 307 00:13:21,980 --> 00:13:22,480 que. 308 00:13:22,480 --> 00:13:24,440 Et voir le descriptif en conséquence. 309 00:13:24,440 --> 00:13:26,120 >> Pendant ce temps, nous vérifions une autre chose. 310 00:13:26,120 --> 00:13:30,110 Si l'utilisateur a visité un répertoire et ce répertoire 311 00:13:30,110 --> 00:13:35,240 contient un fichier appelé index.html index.php ou, par convention humaine 312 00:13:35,240 --> 00:13:37,840 nous ne voulons pas de leur montrer la contenu de ce répertoire. 313 00:13:37,840 --> 00:13:41,990 Nous voulons leur montrer le contenu de ce fichier par défaut, index.html 314 00:13:41,990 --> 00:13:43,640 ou index.php. 315 00:13:43,640 --> 00:13:45,750 Et si le code que je l'ai appels mis en évidence ici 316 00:13:45,750 --> 00:13:48,430 une fonction appelée index qui vérifie simplement, 317 00:13:48,430 --> 00:13:53,610 Existe-il un fichier ici nommé index.html ou index.php. 318 00:13:53,610 --> 00:13:55,830 >> Dans le cas contraire, si aucun des ces conditions sont applicables 319 00:13:55,830 --> 00:13:57,920 nous appelons tout simplement fonction liste, qui nous avons écrit, 320 00:13:57,920 --> 00:14:00,280 qui énumère littéralement le contenu d'un répertoire. 321 00:14:00,280 --> 00:14:03,680 Tout à droite, et si la demande que le navigateur de l'utilisateur a fait 322 00:14:03,680 --> 00:14:05,830 est pas pour un répertoire, mais pour un fichier? 323 00:14:05,830 --> 00:14:07,980 Eh bien, tout d'abord que nous appelons une fonction de recherche. 324 00:14:07,980 --> 00:14:10,750 Qui va dire à la serveur, est-ce un JPEG, est-ce 325 00:14:10,750 --> 00:14:13,770 un fichier HTML, est-ce une GIF, ou un autre format. 326 00:14:13,770 --> 00:14:17,300 Si oui, il est ensuite aller vérifier, ainsi, est-il un fichier PHP. 327 00:14:17,300 --> 00:14:20,060 Si oui, nous voulons appeler une fonction appelés interpréter, que nous avons écrit, 328 00:14:20,060 --> 00:14:22,540 qui interprète ce fichier PHP et recrache les résultats. 329 00:14:22,540 --> 00:14:24,941 Ou, plus convaincante, si elle est quelque chose d'autre, 330 00:14:24,941 --> 00:14:26,690 Allons de l'avant et simplement transférer le fichier. 331 00:14:26,690 --> 00:14:29,680 Comme le GIF ou JPEG à partir du serveur à l'utilisateur, 332 00:14:29,680 --> 00:14:33,750 comme si ils ont demandé une page HTML, l'image, ou tout nombre d'autres choses. 333 00:14:33,750 --> 00:14:37,920 >> Enfin, si rien ne semble d'autre travail, nous allons juste-à-dire 501. 334 00:14:37,920 --> 00:14:42,190 Qui est que 501, pas mis en œuvre message, signifiant que le serveur 335 00:14:42,190 --> 00:14:44,230 est pas encore terminée.